home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / intuitin / dmouse12.1 < prev    next >
Text File  |  1989-08-21  |  71KB  |  2,659 lines

  1. Path: xanth!ames!sun-barr!newstop!sun!swap!page
  2. From: page%swap@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i172:  dmouse - mouse accelerator, screen blanker etc v1.20
  5. Message-ID: <122695@sun.Eng.Sun.COM>
  6. Date: 21 Aug 89 06:47:06 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 2648
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: dillon@postgres.berkeley.edu (Matt Dillon)
  12. Posting-number: Volume 89, Issue 172
  13. Archive-name: intuition/dmouse120.1
  14.  
  15. DMouse V1.20 & DLineArt
  16.  
  17. The latest version of DMouse.  Also included is Steve -Raz- Berry's
  18. DLineArt screen blanker program.  Simply run DLineArt after installing
  19. DMouse and DMouse will use DLineArt for a screen blanker instead of its
  20. own dull internal blanker.
  21.  
  22. DMouse no longer requires dres.library and will now compile under either
  23. Manx C or Lattice C.  DLineArt currently compiles only under Manx C.
  24.  
  25. # This is a shell archive.
  26. # Remove anything above and including the cut line.
  27. # Then run the rest of the file through 'sh'.
  28. # Unpacked files will be owned by you and have default permissions.
  29. #----cut here-----cut here-----cut here-----cut here----#
  30. #!/bin/sh
  31. # shar: SHell ARchive
  32. # Run the following text through 'sh' to create:
  33. #    DMakefile.Aztec
  34. #    DMakefile.Lattice
  35. #    README
  36. #    blanker.c
  37. #    dlineart.c
  38. #    dlineart.doc
  39. #    dmouse-handler.c
  40. #    dmouse-ipc.doc
  41. #    dmouse.c
  42. #    dmouse.doc
  43. #    dmouse.h
  44. # This is archive 1 of a 1-part kit.
  45. # This archive created: Sun Aug 20 23:45:39 1989
  46. echo "extracting DMakefile.Aztec"
  47. sed 's/^X//' << \SHAR_EOF > DMakefile.Aztec
  48. X
  49. X#   DMakefile for DMouse, Aztec C V3.6a
  50. X#
  51. X#   +L = 32 bit ints
  52. X
  53. XSYMS=    aztec_include:symbols.m
  54. XCFLAGS= +L +I$(SYMS)
  55. XOD  = atmp:dmouse/
  56. X
  57. XDMOUSE        = sys:altc/dmouse
  58. XHANDLER     = l:dmouse-handler
  59. XBLANKER     = srcc:blanker
  60. XLINEART     = srcc:dlineart
  61. X
  62. Xall: $(DMOUSE) $(HANDLER) $(BLANKER) $(LINEART)
  63. X
  64. X$(DMOUSE) : $(OD)dmouse.o
  65. X    ln +Q %(right) -lsup32 -lc32 -o %(left)
  66. X
  67. X$(HANDLER) : $(OD)dmouse-handler.o
  68. X    ln +Q %(right) -lsup32 -lc32 -o %(left)
  69. X
  70. X$(BLANKER) : $(OD)blanker.o
  71. X    ln +Q %(right) -lsup32 -lc32 -o %(left)
  72. X
  73. X$(LINEART) : $(OD)dlineart.o
  74. X    ln +Q %(right) -lsup32 -lm32 -lc32 -o %(left)
  75. X
  76. X$(OD)dmouse.o $(OD)blanker.o : dmouse.c blanker.c
  77. X    cc $(CFLAGS) %(right) -o %(left)
  78. X
  79. X$(OD)dmouse-handler.o : dmouse-handler.c
  80. X    cc +B $(CFLAGS) %(right) -o %(left)
  81. X
  82. X
  83. SHAR_EOF
  84. echo "extracting DMakefile.Lattice"
  85. sed 's/^X//' << \SHAR_EOF > DMakefile.Lattice
  86. X
  87. X#   DMakefile for DMouse,    Lattice C V5.03.99 and beyond
  88. X
  89. XSYMS=    lattice_include:symbols.m
  90. X#CFLAGS= -iprivate_include: -cimq -O -v -rr -H$(SYMS)
  91. XCFLAGS= -iprivate_include: -cimq -O -v -rr
  92. X
  93. XOD  = ltmp:dmouse/
  94. X
  95. XDMOUSE        = dhb:altc/dmouse
  96. XHANDLER     = l:dmouse-handler
  97. XBLANKER     = srcc:blanker
  98. XLINEART     = srcc:dlineart
  99. XLIBS        = lib:sup32.lib lib:lcr.lib lib:amiga.lib
  100. X
  101. X#SRCS         = blanker.c dmouse.c dmouse-handler.c dlineart.c
  102. XSRCS        = dmouse.c dmouse-handler.c blanker.c
  103. XOBJS        = $(SRCS:"*.c":"$(OD)*.o")
  104. X
  105. X#all: $(DMOUSE) $(HANDLER) $(BLANKER) $(LINEART)
  106. Xall: $(DMOUSE) $(HANDLER) $(BLANKER)
  107. X
  108. X$(DMOUSE) : $(OD)dmouse.o
  109. X    blink FROM LIB:c.o %(right) LIB $(LIBS) TO %(left) BATCH
  110. X
  111. X$(HANDLER) : $(OD)dmouse-handler.o
  112. X    blink FROM %(right) LIB $(LIBS) TO %(left) BATCH
  113. X
  114. X$(BLANKER) : $(OD)blanker.o
  115. X     blink FROM LIB:c.o %(right) LIB $(LIBS) TO %(left) BATCH
  116. X
  117. X#$(LINEART) : $(OD)dlineart.o
  118. X#    blink FROM LIB:c.o %(right) LIB $(LIBS) TO %(left) BATCH
  119. X
  120. X$(OBJS) : $(SRCS)
  121. X    lc $(CFLAGS) -o%(left) %(right)
  122. X
  123. X
  124. SHAR_EOF
  125. echo "extracting README"
  126. sed 's/^X//' << \SHAR_EOF > README
  127. X
  128. X            README FILES FOR DMOUSE DISTRIBTION
  129. X
  130. X    Note, checkout the DMakefile's for required assignments before attempting
  131. X    to make the source.  The 'dmake' program makes the source.
  132. X
  133. XDMakefile.Lattice    Lattice V5.02 DMakefile for dmake
  134. XDMakefile.Aztec     Aztec V3.6a   DMakefile for dmake
  135. X
  136. Xdmouse.doc        documentation
  137. Xdmouse.c        source
  138. Xdmouse.h        source
  139. Xdmouse-handler.c    source
  140. X
  141. Xblanker.c        source to example blanker
  142. Xdlineart.c        (currently compiles under Aztec C only)
  143. X
  144. Xlocal/*.h        general includes (from sup32.lib.  you need these to
  145. X            compile DMouse as well as the link library binary)
  146. X
  147. Xdmake            required to compile the source
  148. X
  149. Xdmouse            dmouse executable.  control program
  150. Xl:dmouse-handler    dmouse-handler should go into l:
  151. X
  152. X
  153. X            Quick Installation
  154. X           Please read the documentation!
  155. X
  156. X1> dmouse            -install dmouse
  157. X1> dmouse quit            -quit out of dmouse
  158. X1> dmouse help            -show available options for dmouse
  159. X
  160. SHAR_EOF
  161. echo "extracting blanker.c"
  162. sed 's/^X//' << \SHAR_EOF > blanker.c
  163. X
  164. X/*
  165. X *  BLANKER.C
  166. X *
  167. X *  Example external screen blanker for DMouse.
  168. X */
  169. X
  170. X#include <local/typedefs.h>
  171. X#include <local/ipc.h>
  172. X#include <local/xmisc.h>
  173. X
  174. X#ifdef LATTICE
  175. X#include <dos.h>
  176. X#include <stdio.h>
  177. X#include <stdlib.h>
  178. X#include <string.h>
  179. X
  180. Xint __stdargs CXBRK(void);
  181. X
  182. X__stdargs    /*  bug in lcr.lib  */
  183. XCXBRK()
  184. X{
  185. X    return(0);
  186. X}
  187. X
  188. X#else
  189. Xextern int Enable_Abort;    /*    CLI break enable    */
  190. X#endif
  191. X
  192. X
  193. X#define RATE    1000000
  194. X
  195. Xtypedef struct IORequest IORequest;
  196. X
  197. Xstatic SCR *Scr;
  198. Xstatic TA   Ta = {  (ubyte *)"topaz.font", 8 };
  199. Xstatic NS   Ns = {  0, 0, 320, -1, 1, -1, -1, 0, CUSTOMSCREEN|SCREENQUIET, &Ta };
  200. X
  201. Xstatic IOT Iot;
  202. Xstatic char Ioip;
  203. Xstatic char *TStr = "Blank";
  204. Xstatic char *TSpa = "     ";
  205. Xstatic long TLen = 5;
  206. X
  207. Xvoid main ARGS((int, char **));
  208. Xvoid screenon ARGS((void));
  209. Xvoid screenoff ARGS((void));
  210. Xvoid screengraphics ARGS((void));
  211. Xlong myrand ARGS((void));
  212. X
  213. Xvoid
  214. Xmain(ac,av)
  215. Xchar **av;
  216. X{
  217. X    PORT *dmport;
  218. X    PORT *ipport;
  219. X    PORT *tp;
  220. X    IORequest    AddReq;
  221. X    IORequest    RemReq;
  222. X    char foo;    /*  dummy   */
  223. X    char notdone = 1;
  224. X
  225. X#ifndef LATTICE
  226. X    Enable_Abort = 0;
  227. X#endif
  228. X
  229. X    tp       = CreatePort(NULL, 0);
  230. X    ipport = CreatePort(NULL, 0);
  231. X
  232. X    AddReq.io_Message.mn_ReplyPort = ipport;
  233. X    AddReq.io_Command = 0x84;
  234. X    AddReq.io_Unit = (struct Unit *)&foo;
  235. X    AddReq.io_Flags = 0x0C;    /* %1100 (screen blanker, no mouse blanker) */
  236. X
  237. X    RemReq.io_Message.mn_ReplyPort = ipport;
  238. X    RemReq.io_Command = 0x85;
  239. X    RemReq.io_Unit = (struct Unit *)&foo;
  240. X
  241. X    if (openlibs(INTUITION_LIB|GRAPHICS_LIB) == 0)
  242. X    goto fail;
  243. X    if (OpenDevice("timer.device", UNIT_VBLANK, &Iot, 0)) {
  244. X    Write(Output(), "Unable to open timer.device\n", 28);
  245. X    goto fail;
  246. X    }
  247. X    Iot.tr_node.io_Message.mn_ReplyPort = tp;
  248. X    Iot.tr_node.io_Command = TR_ADDREQUEST;
  249. X
  250. X    SetSignal(0, SIGBREAKF_CTRL_C);
  251. X    Forbid();
  252. X    if (dmport = FindPort("DMouse.ipc"))
  253. X    PutMsg(dmport, &AddReq.io_Message);
  254. X    Permit();
  255. X    if (dmport == NULL) {
  256. X    puts("DMouse not running or <V1.20");
  257. X    goto fail;
  258. X    }
  259. X
  260. X    while (notdone) {
  261. X    long mask = (1 << tp->mp_SigBit) | (1 << ipport->mp_SigBit) | SIGBREAKF_CTRL_C;
  262. X    mask = Wait(mask);
  263. X
  264. X    if (mask & SIGBREAKF_CTRL_C) {
  265. X        notdone = 0;
  266. X    }
  267. X    if ((mask & (1 << tp->mp_SigBit)) && Scr && Ioip && CheckIO(&Iot)) {
  268. X        WaitIO(&Iot);
  269. X        Iot.tr_time.tv_secs  = RATE / 1000000;
  270. X        Iot.tr_time.tv_micro = RATE % 1000000;
  271. X        SendIO(&Iot);
  272. X        screengraphics();
  273. X    }
  274. X    if (mask & (1 << ipport->mp_SigBit)) {
  275. X        IORequest *ior;
  276. X        while (ior = (IORequest *)GetMsg(ipport)) {
  277. X        if (ior->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {   /* my AddHand req */
  278. X            notdone = 0;
  279. X            continue;
  280. X        }
  281. X        switch(ior->io_Command) {
  282. X        case 0x80:
  283. X        case 0x81:
  284. X            break;
  285. X        case 0x82:
  286. X            screenon();
  287. X            break;
  288. X        case 0x83:
  289. X            screenoff();
  290. X            break;
  291. X        case 0x86:
  292. X            notdone = 0;
  293. X            break;
  294. X        }
  295. X        ReplyMsg(&ior->io_Message);
  296. X        }
  297. X    }
  298. X    }
  299. X    PutMsg(dmport, &RemReq.io_Message);
  300. X    WaitMsg(&RemReq);
  301. X    {
  302. X    register IORequest *ior = NULL;
  303. X    while (ior != &AddReq) {    /*  last msg will be AddReq */
  304. X        WaitPort(ipport);
  305. X        ior = (IORequest *)GetMsg(ipport);
  306. X        if (ior->io_Message.mn_Node.ln_Type == NT_MESSAGE)
  307. X        ReplyMsg(&ior->io_Message);
  308. X    }
  309. X    }
  310. Xfail:
  311. X    if (Ioip) {
  312. X    AbortIO(&Iot);
  313. X    WaitIO(&Iot);
  314. X    }
  315. X    if (Iot.tr_node.io_Device)
  316. X    CloseDevice(&Iot);
  317. X    if (tp)
  318. X    DeletePort(tp);
  319. X    if (ipport)
  320. X    DeletePort(ipport);
  321. X    closelibs(-1);
  322. X}
  323. X
  324. Xvoid
  325. Xscreenoff()
  326. X{
  327. X    if (Scr)
  328. X    ScreenToFront(Scr);
  329. X    else if (Scr = OpenScreen(&Ns)) {
  330. X    if (!Ioip) {
  331. X        Iot.tr_time.tv_secs  = 3;
  332. X        Iot.tr_time.tv_micro = 0;
  333. X        SendIO(&Iot);
  334. X        Ioip = 1;
  335. X    }
  336. X    }
  337. X}
  338. X
  339. Xvoid
  340. Xscreenon()
  341. X{
  342. X    if (Scr)
  343. X    CloseScreen(Scr);
  344. X    Scr = NULL;
  345. X    if (Ioip) {
  346. X    AbortIO(&Iot);
  347. X    WaitIO(&Iot);
  348. X    Ioip = 0;
  349. X    }
  350. X}
  351. X
  352. X/*
  353. X *  Simple Stupid
  354. X *
  355. X *  Warning:  Note that no clipping is done when using the screen's
  356. X *          rastport, all rendering must be IN BOUNDS!
  357. X */
  358. X
  359. Xvoid
  360. Xscreengraphics()
  361. X{
  362. X    static short oldx, oldy;
  363. X    short x, y;
  364. X
  365. X    x = (myrand() & 4095) % (Scr->Width - TextLength(&Scr->RastPort, TStr, TLen) - 8);
  366. X    y = (myrand() & 4095) % (Scr->Height- Scr->RastPort.TxHeight - Scr->RastPort.TxBaseline - 8);
  367. X    if (x < 0 || y < 0)
  368. X    return;
  369. X    y += Scr->RastPort.TxBaseline + 4;
  370. X
  371. X    SetAPen(&Scr->RastPort, 0);
  372. X    Move(&Scr->RastPort, oldx, oldy);
  373. X    Text(&Scr->RastPort, TSpa, TLen);
  374. X
  375. X    oldx = x;
  376. X    oldy = y;
  377. X    SetRGB4(&Scr->ViewPort, 1, myrand()&15, myrand()&15, myrand()&15);
  378. X
  379. X    SetAPen(&Scr->RastPort, 1);
  380. X    Move(&Scr->RastPort, oldx, oldy);
  381. X    Text(&Scr->RastPort, TStr, TLen);
  382. X}
  383. X
  384. X
  385. Xlong
  386. Xmyrand()
  387. X{
  388. X    static long rv = 34987;
  389. X    rv = (rv * 13 + 1) ^ (rv >> 13);
  390. X    return(rv);
  391. X}
  392. X
  393. X
  394. X
  395. SHAR_EOF
  396. echo "extracting dlineart.c"
  397. sed 's/^X//' << \SHAR_EOF > dlineart.c
  398. X
  399. X/*
  400. X *  DLineArt.c
  401. X *
  402. X *  DMouse screen blanker for use with DMouse V1.20
  403. X *
  404. X *  read the docs file for installation procedures.
  405. X *
  406. X *  Is your computer BORED? If so, then you need...
  407. X *
  408. X *        DLineArt, by Steve -Raz- Berry with help
  409. X *        from Matt Dillon.
  410. X *
  411. X *  Compile +L w/ sup32.lib.  libs:dres.library no longer required
  412. X */
  413. X
  414. X#include <local/typedefs.h>
  415. X#include <local/ipc.h>
  416. X#include <local/xmisc.h>
  417. X
  418. Xtypedef struct IORequest IORequest;
  419. X
  420. X#define MAXELLIPSE 75
  421. X
  422. X/* Be carefule if modifiying the following defines... */
  423. X
  424. Xint MAXX, MAXY;
  425. X
  426. X#define MINBOUND 20
  427. X#define BOUNDX MAXX-MINBOUND
  428. X#define BOUNDY MAXY-MINBOUND
  429. X
  430. X#define TEXTSTR 0x10
  431. X#define SPLINES 0x8
  432. X#define LINES 0x4
  433. X#define BOXES 0x2
  434. X#define ELLIPSES 0x1
  435. X
  436. X/* Maximun # of lines,boxes,ellipses to draw (watch your stack!) */
  437. X
  438. X#define MAXLINES 500
  439. X
  440. XUWORD coltbl[2] = {
  441. X    0x000,        /* background color */
  442. X    0x500
  443. X};
  444. X
  445. Xextern int Enable_Abort;
  446. X
  447. XRP *rp;
  448. XVP *vp;
  449. Xstatic SCR *Scr;
  450. Xstatic WIN *Win;
  451. Xstatic TA   Ta = {  (ubyte *)"topaz.font", 11 };
  452. Xstatic NS   Ns = {  0, 0, 0, 0, 1, -1, -1, HIRES|LACE, CUSTOMSCREEN|SCREENQUIET, &Ta };
  453. Xstatic NW   Nw = { 0, 0, 0, 0, 2, 1, NULL, BORDERLESS|NOCAREREFRESH|BACKDROP,
  454. XNULL, NULL,NULL,NULL,NULL,0,0,8000,8000,CUSTOMSCREEN};
  455. X
  456. Xstatic long offset, scale1, scale2, flags;
  457. Xstatic long count, trails, nice, all;
  458. Xstatic long input, maxlines, ctemp;
  459. Xstatic long point1[MAXLINES+1][2], point2[MAXLINES+1][2], direction[2][2];
  460. X
  461. Xstatic char *TStr = "BOING!";
  462. Xstatic long TLen = 6;
  463. X
  464. Xvoid
  465. XInitScrStructures()
  466. X{
  467. X    SCR scr;
  468. X    if (GetScreenData(&scr, sizeof(scr), WBENCHSCREEN, NULL)) {
  469. X    if (scr.ViewPort.Modes & HIRES)
  470. X        MAXX = scr.Width;
  471. X    else
  472. X        MAXX = scr.Width * 2;
  473. X    if (scr.ViewPort.Modes & LACE)
  474. X        MAXY = scr.Height;
  475. X    else
  476. X        MAXY = scr.Height * 2;
  477. X    } else {
  478. X    MAXX = 640;
  479. X    MAXY = 200;
  480. X    }
  481. X    Ns.Width  = MAXX;
  482. X    Nw.Width  = MAXX;
  483. X    Ns.Height = MAXY;
  484. X    Nw.Height = MAXY;
  485. X}
  486. X
  487. Xmain(argc,argv)
  488. Xint argc;
  489. Xchar *argv[];
  490. X{
  491. X    int var;
  492. X    IORequest AddReq;    /* for dmouse ipc    */
  493. X    IORequest RemReq;
  494. X    PORT    *dmport;
  495. X    PORT    *ipport;
  496. X    char    foo;    /*  dummy variable, address used as id    */
  497. X    short   notdone = 1;
  498. X
  499. X    input  = 3;     /* Some defaults for switches */
  500. X    trails = 1;
  501. X    maxlines = 20;
  502. X    nice  = FALSE;
  503. X    all   = FALSE;
  504. X    flags = LINES;
  505. X
  506. X
  507. X    Enable_Abort = 0;
  508. X
  509. X    while(--argc >= 1) {
  510. X    switch (argv[argc][0]) {
  511. X        case '-':
  512. X        switch (argv[argc][1]) {
  513. X            case 'T':
  514. X            flags = TEXTSTR;
  515. X            TStr = &argv[argc][2];
  516. X            if (TStr[0] != \0)
  517. X                TLen = strlen(TStr);
  518. X            break;
  519. X            case 's':
  520. X            flags = SPLINES;
  521. X            break;
  522. X            case 't':
  523. X            trails = 0;
  524. X            break;
  525. X            case 'n':
  526. X            nice = TRUE;
  527. X            break;
  528. X            case 'l':
  529. X            maxlines = atoi(&argv[argc][2]);
  530. X            maxlines = (maxlines > MAXLINES) ? MAXLINES : (maxlines < 1) ? 1 : maxlines;
  531. X            break;
  532. X            case 'c':
  533. X            ctemp = atoi(&argv[argc][2]);
  534. X            coltbl[1] = (ctemp > 4096) ? 4096 : (ctemp < 1) ? 1 : ctemp;
  535. X            break;
  536. X            case 'b':
  537. X            flags = BOXES;
  538. X            break;
  539. X            case 'e':
  540. X            flags = ELLIPSES;
  541. X            break;
  542. X            case 'a':
  543. X            all = TRUE;
  544. X            break;
  545. X            default:
  546. X            exit(20);
  547. X        }
  548. X        break;
  549. X        default:
  550. X        input = atoi(argv[argc]);
  551. X        break;
  552. X    }
  553. X    }
  554. X
  555. X    input = (input > 9) ? 9 : (input < 0) ? 1 : input;
  556. X
  557. X    count = 0;
  558. X    scale1 = 2;
  559. X    scale2 = 2;
  560. X    offset = 0;
  561. X
  562. X    ipport = CreatePort(NULL, 0);   /*  ipc port    */
  563. X
  564. X    if (openlibs(INTUITION_LIB|GRAPHICS_LIB) == 0)
  565. X    goto fail;
  566. X
  567. X    InitScrStructures();
  568. X
  569. X    for(var = 0; var < VBeamPos(); ++var)
  570. X    get_rand_point();
  571. X
  572. X    point1[0][0] = get_rand_point();    /* Initial start x,y (one endpoint) */
  573. X    point1[0][1] = get_rand_point();
  574. X
  575. X    point2[0][0] = get_rand_point();
  576. X    point2[0][1] = get_rand_point();
  577. X
  578. X    for(var = 0; var < 2; ++var){
  579. X    direction[var][0] = get_rand_dir();
  580. X    direction[var][1] = get_rand_dir();
  581. X    }
  582. X
  583. X    AddReq.io_Message.mn_ReplyPort = ipport;
  584. X    AddReq.io_Command = 0x84;
  585. X    AddReq.io_Unit = (struct Unit *)&foo;
  586. X    AddReq.io_Flags = 0x0C;    /* %1100 (screen blanker, no mouse blanker) */
  587. X
  588. X    RemReq.io_Message.mn_ReplyPort = ipport;
  589. X    RemReq.io_Command = 0x85;
  590. X    RemReq.io_Unit = (struct Unit *)&foo;
  591. X
  592. X    Forbid();
  593. X    if (dmport = FindPort("DMouse.ipc"))
  594. X    PutMsg(dmport, &AddReq.io_Message);
  595. X    Permit();
  596. X    if (dmport == NULL) {
  597. X    puts("DMouse not running or <V1.20");
  598. X    goto fail;
  599. X    }
  600. X
  601. X    while (notdone) {
  602. X    long mask = SIGBREAKF_CTRL_C | (1 << ipport->mp_SigBit);
  603. X    if (Scr)
  604. X        mask = SetSignal(0L, mask);
  605. X    else
  606. X        mask = Wait(mask);
  607. X
  608. X    if (mask & SIGBREAKF_CTRL_C)
  609. X        notdone = 0;
  610. X    if (mask & (1 << ipport->mp_SigBit)) {
  611. X        IORequest *ior;
  612. X        while (ior = (IORequest *)GetMsg(ipport)) {
  613. X        if (ior->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {
  614. X            notdone = 0;
  615. X            continue;
  616. X        }
  617. X        switch(ior->io_Command) {
  618. X        case 0x82:
  619. X            screenon();
  620. X            break;
  621. X        case 0x83:
  622. X            screenoff();
  623. X            break;
  624. X        case 0x86:
  625. X            notdone = 0;
  626. X            break;
  627. X        }
  628. X        ReplyMsg(&ior->io_Message);
  629. X        }
  630. X    }
  631. X    if (Win)
  632. X        LineArt();
  633. X    }
  634. X    screenon();
  635. X    PutMsg(dmport, &RemReq.io_Message);
  636. X    {
  637. X    register IORequest *ior = NULL;
  638. X    while (ior != &AddReq) {
  639. X        WaitPort(ipport);
  640. X        ior = (IORequest *)GetMsg(ipport);
  641. X        if (ior->io_Message.mn_Node.ln_Type == NT_MESSAGE)
  642. X        ReplyMsg(&ior->io_Message);
  643. X    }
  644. X    }
  645. Xfail:
  646. X    DeletePort(ipport);
  647. X    closelibs(-1);
  648. X}
  649. X
  650. Xscreenoff()
  651. X{
  652. X    if (Scr)
  653. X    ScreenToFront(Scr);
  654. X    else if (Scr = OpenScreen(&Ns)) {
  655. X    Nw.Screen = Scr;
  656. X    if (Win = OpenWindow(&Nw)){
  657. X        vp = &Scr->ViewPort;
  658. X        rp = Win->RPort;
  659. X        LoadRGB4(vp,coltbl,2L);
  660. X    }
  661. X    ShowTitle(Scr, FALSE);
  662. X    }
  663. X}
  664. X
  665. Xscreenon()
  666. X{
  667. X    if (Win)
  668. X    CloseWindow(Win);
  669. X    if (Scr)
  670. X    CloseScreen(Scr);
  671. X    Win = NULL;
  672. X    Scr = NULL;
  673. X    vp = NULL;
  674. X    rp = NULL;
  675. X}
  676. X
  677. XLineArt()
  678. X{
  679. X    register int newoffset, tempx, tempy;
  680. X
  681. X    SetAPen(rp, 1L);
  682. X
  683. X    if (nice)
  684. X    WaitTOF();
  685. X
  686. X    switch (flags) {
  687. X    case LINES:
  688. X    Move(rp, point1[offset][0], point1[offset][1]);
  689. X    Draw(rp, point2[offset][0], point2[offset][1]);
  690. X    break;
  691. X    case ELLIPSES:
  692. X    doellipse(offset);
  693. X    break;
  694. X    case BOXES:
  695. X    dobox(offset);
  696. X    break;
  697. X    case SPLINES:
  698. X    dospline(offset);
  699. X    break;
  700. X    case TEXTSTR:
  701. X    doteresa(offset);
  702. X    break;
  703. X    }
  704. X
  705. X    if (checkbounce1(offset)) {
  706. X    tempx = direction[0][0];
  707. X    tempy = direction[0][1];
  708. X
  709. X    direction[0][0] = (point1[offset][0] <= MINBOUND) ? 1 :
  710. X    (point1[offset][0] >= BOUNDX) ? -1 :
  711. X    get_rand_dir();
  712. X
  713. X    direction[0][1] = (point1[offset][1] <= MINBOUND) ? 1 :
  714. X    (point1[offset][1] >= BOUNDY) ? -1 :
  715. X    get_rand_dir();
  716. X
  717. X    scale1 = get_rand_scale();
  718. X    }
  719. X
  720. X    if (checkbounce2(offset)) {
  721. X    tempx = direction[1][0];
  722. X    tempy = direction[1][1];
  723. X
  724. X    direction[1][0] = (point2[offset][0] <= MINBOUND) ? 1 :
  725. X    (point2[offset][0] >= BOUNDX) ? -1 :
  726. X    get_rand_dir();
  727. X
  728. X    direction[1][1] = (point2[offset][1] <= MINBOUND) ? 1 :
  729. X    (point2[offset][1] >= BOUNDY) ? -1 :
  730. X    get_rand_dir();
  731. X
  732. X    scale2 = get_rand_scale();
  733. X    }
  734. X
  735. X    if ((++count > 60000) | (count > 2500 && (flags == ELLIPSES))) {
  736. X    count = maxlines;
  737. X    if (trails == 0 | all) {
  738. X        count = 0;
  739. X        offset = 0;
  740. X        Move(rp, 0, 0);
  741. X        ClearScreen(rp);
  742. X    }
  743. X    if (all) {
  744. X        flags = flags << 1;
  745. X        if (flags > TEXTSTR)
  746. X        flags = ELLIPSES;
  747. X    }
  748. X    }
  749. X
  750. X    if (++offset > maxlines){
  751. X    coltbl[1]++;
  752. X    LoadRGB4(vp,coltbl,2L);
  753. X    if ((coltbl[1] && 0x00f) > 0xb) {
  754. X        coltbl[1] = coltbl[1] & 0xff0;
  755. X        coltbl[1] += 0x010;
  756. X    }
  757. X    if ((coltbl[1] && 0x0f0) > 0xb0) {
  758. X        coltbl[1] = coltbl[1] & 0xf0f;
  759. X        coltbl[1] += 0x100;
  760. X    }
  761. X    if ((coltbl[1] && 0xf00) > 0xb00) {
  762. X        coltbl[1] = ctemp;
  763. X    }
  764. X    }
  765. X
  766. X    if (offset > maxlines)
  767. X    offset = 0;
  768. X
  769. X    /* Erase the oldest line... (or ellipse) */
  770. X
  771. X    if (count > maxlines-1) {
  772. X    newoffset = (offset == maxlines) ? 0 : offset + trails;
  773. X    SetAPen(rp, 0L);
  774. X    switch (flags) {
  775. X    case LINES:
  776. X        Move(rp, point1[newoffset][0], point1[newoffset][1]);
  777. X        Draw(rp, point2[newoffset][0], point2[newoffset][1]);
  778. X        break;
  779. X    case ELLIPSES:
  780. X        doellipse(newoffset);
  781. X        break;
  782. X    case BOXES:
  783. X        dobox(newoffset);
  784. X        break;
  785. X    case SPLINES:
  786. X        dospline(newoffset);
  787. X        break;
  788. X    case TEXTSTR:
  789. X        doteresa(newoffset);
  790. X        break;
  791. X    }
  792. X    SetAPen(rp, 1L);
  793. X    }
  794. X
  795. X    /* Calculate the next point */
  796. X
  797. X    newoffset = (offset > 0) ? offset-1 : maxlines;
  798. X    point1[offset][0] = (scale1 * direction[0][0]) + point1[newoffset][0];
  799. X    point1[offset][1] = (scale1 * direction[0][1]) + point1[newoffset][1];
  800. X
  801. X    if (flags != TEXTSTR){
  802. X      point2[offset][0] = (scale2 * direction[1][0]) + point2[newoffset][0];
  803. X      point2[offset][1] = (scale2 * direction[1][1]) + point2[newoffset][1];
  804. X    } else {
  805. X      point2[offset][0] = point1[offset][0] + TextLength(rp, TStr, TLen);
  806. X      point2[offset][1] = point1[offset][1];
  807. X    }
  808. X}
  809. X
  810. Xdoteresa(offset)
  811. Xint offset;
  812. X{
  813. X    register short x,y;
  814. X
  815. X    x = (Scr->Width - TextLength(rp, TStr, TLen) - 20);
  816. X    y = (Scr->Height- Scr->RastPort.TxHeight - Scr->RastPort.TxBaseline - 8);
  817. X
  818. X    if (x < 0 || y < 0)
  819. X    return;
  820. X
  821. X    x = (x < point1[offset][0]) ? x : point1[offset][0];
  822. X    y = (y < point1[offset][1]) ? y : point1[offset][1];
  823. X
  824. X    Move(rp, x, y);
  825. X    Text(rp, TStr, TLen);
  826. X}
  827. X
  828. Xdoellipse(newoffset)
  829. Xregister int newoffset;
  830. X{
  831. X    register int tempx,tempy;
  832. X
  833. X    tempx = (point2[newoffset][0] > point1[newoffset][0]) ?
  834. X    point2[newoffset][0] - point1[newoffset][0] :
  835. X    point1[newoffset][0] - point2[newoffset][0];
  836. X
  837. X    tempy = (point2[newoffset][1] > point1[newoffset][1]) ?
  838. X    point2[newoffset][1] - point1[newoffset][1] :
  839. X    point1[newoffset][1] - point2[newoffset][1];
  840. X
  841. X    tempx = (tempx > point1[newoffset][0]) ? point1[newoffset][0] :
  842. X    ((tempx + point1[newoffset][0]) > BOUNDX) ? BOUNDX - point1[newoffset][0] :
  843. X    tempx;
  844. X
  845. X    tempy = (tempy > point1[newoffset][1]) ? point1[newoffset][1] :
  846. X    ((tempy + point1[newoffset][1]) > BOUNDY) ? BOUNDY - point1[newoffset][1] :
  847. X    tempy;
  848. X
  849. X    tempx = (tempx > MAXELLIPSE) ? MAXELLIPSE : tempx;
  850. X    tempy = (tempy > MAXELLIPSE) ? MAXELLIPSE : tempy;
  851. X
  852. X    if (tempx > 0 && tempy > 0)
  853. X    DrawEllipse(rp, point1[newoffset][0], point1[newoffset][1], tempx, tempy);
  854. X}
  855. X
  856. Xdobox(offset)
  857. Xregister int offset;
  858. X{
  859. X    register int tempx, tempy;
  860. X
  861. X    Move(rp, point1[offset][0], point1[offset][1]);
  862. X    Draw(rp, point2[offset][0], point2[offset][1]);
  863. X
  864. X    tempx = MAXX - point1[offset][0];
  865. X    tempy = MAXY - point1[offset][1];
  866. X
  867. X    if (tempx >= 0 && tempy >= 0)
  868. X    Draw(rp, tempx, tempy);
  869. X
  870. X    tempx = MAXX - point2[offset][0];
  871. X    tempy = MAXY - point2[offset][1];
  872. X
  873. X    if (tempx >= 0 || tempy >= 0)
  874. X    Draw(rp, tempx, tempy);
  875. X
  876. X    Draw(rp, point1[offset][0], point1[offset][1]);
  877. X}
  878. X
  879. Xlong checkbounce1(index)
  880. Xregister int index;
  881. X{
  882. X
  883. X    return (point1[index][0] >= BOUNDX) | (point1[index][1] >= BOUNDY) |
  884. X        (point1[index][0] <= MINBOUND) | (point1[index][1] <= MINBOUND);
  885. X}
  886. X
  887. Xlong checkbounce2(index)
  888. Xregister int index;
  889. X{
  890. X    return (point2[index][0] >= BOUNDX) | (point2[index][1] >= BOUNDY) |
  891. X        (point2[index][0] <= MINBOUND) | (point2[index][1] <= MINBOUND);
  892. X}
  893. X
  894. Xint get_rand_point()
  895. X{
  896. X    register short temp;
  897. X
  898. X    temp = ran();
  899. X    if (temp < 0)
  900. X    temp = temp * -1;
  901. X    temp = temp/319+19;
  902. X
  903. X    return (temp > MAXY) ? MAXY : temp ;
  904. X}
  905. X
  906. Xint get_rand_dir()
  907. X{
  908. X    register short num;
  909. X
  910. X    num = ran((short)3);
  911. X
  912. X    return (num < -5000) ? -1 : (num > 5000) ? 1 : 0;
  913. X}
  914. X
  915. Xint get_rand_scale()
  916. X{
  917. X    register short temp;
  918. X
  919. X    temp = ran();
  920. X    if (temp < 0)
  921. X    temp = temp * -1;
  922. X    temp = temp/6560 + (short)input;
  923. X
  924. X    return (temp > 17) ? 17 : temp;
  925. X}
  926. X
  927. X#define MAXPOINTS 5
  928. X#define FIX(x) (((long)(x)) << 7)
  929. X
  930. X/*
  931. X *   Draws a spline!  Expects all arguments in registers.
  932. X */
  933. X#asm
  934. X    public    _Draw
  935. X    cseg
  936. Xrspline
  937. X    move.l    a0,d0
  938. X    sub.l    d6,d0
  939. X    move.l    d0,d3
  940. X    bpl    save1
  941. X    neg.l    d0
  942. Xsave1
  943. X    move.l    a1,d1
  944. X    sub.l    d7,d1
  945. X    move.l    d1,d4
  946. X    bpl    save2
  947. X    neg.l    d1
  948. Xsave2
  949. X    move.l    d0,d2
  950. X    cmp.l    d0,d1
  951. X    bmi    save3
  952. X    lsr.l    #3,d2
  953. X    bra    save9
  954. Xsave3
  955. X    lsr.l    #3,d1
  956. Xsave9
  957. X    add.l    d1,d2
  958. X    asr.l    #3,d2
  959. X    asr.l    #5,d3
  960. X    asr.l    #5,d4
  961. X    move.l    a2,d0
  962. X    sub.l    a0,d0
  963. X    move.l    a3,d1
  964. X    sub.l    a1,d1
  965. X    asr.l    #5,d0
  966. X    asr.l    #5,d1
  967. X    muls.w    d4,d0
  968. X    muls.w    d3,d1
  969. X    sub.l    d1,d0
  970. X    bpl    save4
  971. X    neg.l    d0
  972. Xsave4
  973. X    cmp.l    d0,d2
  974. X    bmi    pushem
  975. X    move.l    a5,d0
  976. X    sub.l    a0,d0
  977. X    move.l    a6,d1
  978. X    sub.l    a1,d1
  979. X    asr.l    #5,d0
  980. X    asr.l    #5,d1
  981. X    muls.w    d4,d0
  982. X    muls.w    d3,d1
  983. X    sub.l    d1,d0
  984. X    bpl    save5
  985. X    neg.l    d0
  986. Xsave5
  987. X    cmp.l    d0,d2
  988. X    bmi    pushem
  989. Xmakeline
  990. X    lsr.l    #7,d7
  991. X    move.l    d7,-(sp)
  992. X    lsr.l    #7,d6
  993. X    move.l    d6,-(sp)
  994. X    move.l    _rp,-(sp)
  995. X    jsr    _Draw
  996. X    add.w    #12,a7
  997. X    rts
  998. Xpushem
  999. X    movem.l d6/d7,-(sp)
  1000. X    move.l    a5,d0
  1001. X    add.l    d6,d0
  1002. X    asr.l    #1,d0
  1003. X    move.l    a6,d1
  1004. X    add.l    d7,d1
  1005. X    asr.l    #1,d1
  1006. X    movem.l d0/d1,-(sp)
  1007. X    move.l    a2,d2
  1008. X    add.l    a5,d2
  1009. X    asr.l    #1,d2
  1010. X    move.l    a3,d3
  1011. X    add.l    a6,d3
  1012. X    asr.l    #1,d3
  1013. X    move.l    d0,d4
  1014. X    add.l    d2,d4
  1015. X    asr.l    #1,d4
  1016. X    move.l    d1,d5
  1017. X    add.l    d3,d5
  1018. X    asr.l    #1,d5
  1019. X    movem.l d4/d5,-(sp)
  1020. X    move.l    a0,d6
  1021. X    add.l    a2,d6
  1022. X    asr.l    #1,d6
  1023. X    move.l    a1,d7
  1024. X    add.l    a3,d7
  1025. X    asr.l    #1,d7
  1026. X    move.l    d2,d0
  1027. X    add.l    d6,d0
  1028. X    asr.l    #1,d0
  1029. X    move.l    d3,d1
  1030. X    add.l    d7,d1
  1031. X    asr.l    #1,d1
  1032. X    move.l    d6,a2
  1033. X    move.l    d7,a3
  1034. X    move.l    d0,d6
  1035. X    add.l    d4,d6
  1036. X    asr.l    #1,d6
  1037. X    move.l    d1,d7
  1038. X    add.l    d5,d7
  1039. X    asr.l    #1,d7
  1040. X    movem.l d6/d7,-(sp)
  1041. X    move.l    d0,a5
  1042. X    move.l    d1,a6
  1043. X    jsr    rspline
  1044. X    movem.l (sp)+,a0/a1
  1045. X    movem.l (sp)+,a2/a3/a5/a6
  1046. X    movem.l (sp)+,d6/d7
  1047. X    bra    rspline
  1048. X#endasm
  1049. X/*
  1050. X *   Now our linkage to the spline routine.  Parameters are in 8(a5)...
  1051. X */
  1052. Xint drawspline(x1, y1, x2, y2, x3, y3, x4, y4)
  1053. Xlong x1, y1, x2, y2, x3, y3, x4, y4 ;
  1054. X{
  1055. X#asm
  1056. X    movem.l saver,-(sp)
  1057. X    move.l    8(a5),a0
  1058. X    move.l    12(a5),a1
  1059. X    move.l    16(a5),a2
  1060. X    move.l    20(a5),a3
  1061. X    move.l    28(a5),a6
  1062. X    move.l    32(a5),d6
  1063. X    move.l    36(a5),d7
  1064. X    move.l    24(a5),a5
  1065. X    jsr    rspline
  1066. X    movem.l (sp)+,saver
  1067. Xsaver    reg    d0-d7/a0-a6
  1068. X#endasm
  1069. X}
  1070. X
  1071. X/*
  1072. X *   Here we draw splines!  Magic, you know.
  1073. X */
  1074. Xdospline(index)
  1075. Xregister int index;
  1076. X{
  1077. X    int index1;
  1078. X
  1079. X    if (index == 0)
  1080. X    index1 = maxlines;
  1081. X    else
  1082. X    index1 = index - 1;
  1083. X
  1084. X    Move(rp, (long)(point1[index][0]), (long)(point1[index][1])) ;
  1085. X    drawspline(FIX(point1[index][0]), FIX(point1[index][1]),
  1086. X          FIX(point2[index][1]), FIX(point2[index][1]),
  1087. X          FIX(point1[index1][0]), FIX(point1[index1][1]),
  1088. X          FIX(point2[index1][0]), FIX(point2[index1][1])) ;
  1089. X}
  1090. X
  1091. X
  1092. SHAR_EOF
  1093. echo "extracting dlineart.doc"
  1094. sed 's/^X//' << \SHAR_EOF > dlineart.doc
  1095. X
  1096. X    Is your computer BORED? If so, then you need...
  1097. X
  1098. X        DLineArt, by Steve -Raz- Berry with help
  1099. X        from Matt Dillon.
  1100. X
  1101. X    IF YOU ARE IMPATIENT WITH LONG WINDED README'S... skip to the section
  1102. Xlabeled Examples and try them out...
  1103. X
  1104. X This program must be used in conjunction with Dmouse 1.13, and is
  1105. X intended to be a screen blanker replacement program. IT IS NOT
  1106. X STAND ALONE. An earlier release of LineArt works without Dmouse.
  1107. X
  1108. X0) SHORT HISTORY
  1109. X----------------
  1110. X
  1111. X    This display hack does nothing usefull, but draw pretty lines on a
  1112. Xcustom screen. I have seen this program running on everything from Suns
  1113. Xto Mac's, and I decided that it was time that one was done for the Amiga.
  1114. XAlthough similar to the lines demo distributed on Workbench 1.1 & 1.2,
  1115. XIt does things on it's own screen in full 4096 color interlaced
  1116. Xsplendor :*).
  1117. X
  1118. X    Matt Dillon liked it so much that he stitched in a way to
  1119. Xadd your own customized screen blanker via an IPC port. As soon as
  1120. XI found Dmouse 1.13, I took his example "blanker.c", and hacked it
  1121. Xup to support LineArt graphics. I also fixed a few bugs and added a few
  1122. Xmore things along the way.
  1123. X
  1124. X    When I first wrote this program, I was unaware of MACKIE written by
  1125. XTom Rokicki, which draws the same kind of lines boxes and splines
  1126. Xas part of a hot-key/screen-blanker type program. Undaunted (although
  1127. Xsomewhat embarassed) I proceeded to allow infinite customization
  1128. Xto those who are bored enough to want to play with LineArt. Besides, I prefer
  1129. XDMOUSE (Thanks Matt!) for my hot-key handler. Don't get me wrong, I really
  1130. Xlike the way Tom does splines... In fact I stole his spline code and put
  1131. Xit in (D)LineArt.
  1132. X
  1133. X1) TO GET DMOUSE TO RECOGNIZE DLineArt -
  1134. X--------------------------------------
  1135. X
  1136. X    To make dmouse (v1.20+) use the DLineArt screen blanker instead of its
  1137. X    default blanker (a boring blank screen) simply run DLineArt after you
  1138. X    initialize dmouse.
  1139. X
  1140. X------------------------------------------------------
  1141. Xstack 4000
  1142. Xdmouse -a4 -m3 -s90 -l0003 -w1 -t7 -C NewWSH
  1143. Xrunback -1 DLineArt -a -n 3 -c2500 -l30
  1144. X
  1145. X------------------------------------------------------
  1146. X
  1147. X    To terminate DLineArt do this:
  1148. X
  1149. Xraz's prompt> status
  1150. XProcess  1: Loaded as command: dlineart
  1151. XProcess  3: Loaded as command: status
  1152. Xraz's prompt> break 1
  1153. X
  1154. X The break command will terminate DLineArt.
  1155. X
  1156. X Terminating DMouse (1> dmouse quit) will also terminate DLineArt.
  1157. X
  1158. X2) INVOCATION:
  1159. X-------------
  1160. X
  1161. XThere are a LOT of comand line options (for a program like this anyway)!
  1162. X
  1163. X You need to run DLineArt in the background for it to function properly.
  1164. X You can enter the options in ANY order on the command line, and only the
  1165. X last occurance of a particular switch will be used. The options are:
  1166. X
  1167. X    run >nil: <nil: DLineArt -[b|t|n|e|c{0-4096}|l{2-1000}] [i]
  1168. X
  1169. X or use the PD 'runback' program to start DLineArt.
  1170. X
  1171. X The '-l' and '-c' options require an integer immediately following the
  1172. X switch in the range indicated in the {}'s, without a space. Descriptions
  1173. X and examples follow.
  1174. X
  1175. X   Dlineart -t        - This leaves a trail (one out of every 'l' lines)
  1176. X              remains on the screen.
  1177. X
  1178. X        -s        - Draw splines. Code blatently ripped off from Tomas
  1179. X              Rokicki's Mackie.
  1180. X
  1181. X        "-Tstring"
  1182. X            - This option allows you to "bounce" words around the
  1183. X              screen. You MUST enclose quotes around the entire
  1184. X              string. This example will use "string". The default
  1185. X              is the string "BOING!"
  1186. X
  1187. X        -n        - This is the 'nice' option, this makes LineArt much
  1188. X              more friendly in a multitasking environment
  1189. X              (It takes less CPU time.) It also slows things down.
  1190. X
  1191. X        -cXXXX  - This switch allows you to specify the initial color
  1192. X              that the program will cycle from. Suggested color
  1193. X              values start from 1900 (decimal) and up.
  1194. X
  1195. X        -lXXXX  - This switch allows you to specify the number of
  1196. X              lines to be drawn before the last one is erased.
  1197. X
  1198. X        -b        - draw boxes (4 connected lines) instead of lines.
  1199. X
  1200. X        i        - This is an integer between 1 and 9 that will change
  1201. X              the minimum distance between sucessive endpoints for
  1202. X              each line drawn. A high number will give the illusion
  1203. X              of unbelievable speed! (Woah... hold me down Toto!)
  1204. X
  1205. X        -e        - Draw ellipses instead of anything else.
  1206. X              (I would be interested to see this run with an '020)
  1207. X
  1208. X        -a        - Cycle through all of the available line (and circle)
  1209. X              types. This is a good loop mode.
  1210. X
  1211. XThe defaults (if you just type 'run lineart') are as if you entered:
  1212. X
  1213. X run <nil: >nil: DLineArt 3 -a -c1280 -l10 -TBOING!
  1214. X
  1215. X3) EXAMPLES:
  1216. X-----------
  1217. X
  1218. X Some of my favorites:
  1219. X
  1220. X    runback DLineArt 4 -l100 -c2500 -n
  1221. X    runback DLineArt 1 -l10 -c2500
  1222. X    runback DLineArt 9 -l30 -c2500 -n
  1223. X    runback DLineArt 9 -l30 -c2500 -t
  1224. X    runback DLineArt 4 -l3 -c1500 -n
  1225. X    runback DLineArt -b -c2500 1 -l20
  1226. X    runback DLineArt -s -c2500 4 -l35
  1227. X    runback DLineArt "-TI love Teresa!" -c2500 9 -n -l20
  1228. X    runback DLineArt -e 7 -c1999 -l30
  1229. X
  1230. X For speed freaks -
  1231. X    run <nil: >nil: DLineArt 9 -c4000 -l7
  1232. X
  1233. X4) Miscelaneous:
  1234. X---------------
  1235. X
  1236. X    If you want to time the drawing speed (roughly) turn on the trailing option
  1237. X    and wait for the screen to clear. 60,000 lines would have been drawn in
  1238. X    this amount of time.
  1239. X
  1240. X    I timed it at 2'7" (127 seconds) or 944 lines per second in line draw
  1241. X    mode. Using boxes it climbs to 2400 vectors per second. Not too shabby for
  1242. X    a game machine eh?
  1243. X
  1244. X5) Future improvements:
  1245. X
  1246. X    It could be faster, if I use the screen's rastport instead of the
  1247. X    windows'. Unfortuneately, CED (which is an excellent editor) does not
  1248. X    co-exist with DLineart when doing this. I have no clue why this is so.
  1249. X    The only symptoms are that retrieving CED via hot-key produces an instant
  1250. X    GURU. And no, I am NOT drawing out of bounds of the rastport, you
  1251. X    should have seen the debugging code I put in to make sure of that!
  1252. X
  1253. X------------------------------------------------------------------------
  1254. X
  1255. X   This program is PD. Use it or abuse it, only you will know.
  1256. X
  1257. X    Steve -Raz- Berry        (Note the new address)
  1258. X    1260 Ayala Dr. #214
  1259. X    Sunnyvale, Ca. 94086
  1260. X
  1261. X    UUCP: ...sun!kilowatt!raz    ARPA: raz%kilowatt.EBay@sun.com
  1262. X
  1263. X    If you are on USENET, please feel free to use the archive server
  1264. X    on kilowatt. Just send a message of "send help" to the
  1265. X
  1266. X        archive-server%kilowatt.EBay@Sun.com
  1267. X    or    {well bonded site}!sun!kilowatt!archive-server
  1268. X
  1269. X    The archive has *all* of the binaries and sources that Bob Page
  1270. X    has posted and some from the days of Pat White. Currently this
  1271. X    totals to over 40 meg of stuff (zoo'ed and uuencoded).
  1272. X
  1273. X   This program is a Public Domain product of The Checkered Ball 1989.
  1274. X
  1275. X    8/07/89
  1276. SHAR_EOF
  1277. echo "extracting dmouse-handler.c"
  1278. sed 's/^X//' << \SHAR_EOF > dmouse-handler.c
  1279. X
  1280. X/*
  1281. X *  DMOUSE-HANDLER.C
  1282. X *
  1283. X *  (c)Copyright 1989 by Matthew Dillon, All Rights Reserved
  1284. X *
  1285. X *  V1.20, last revision 3 August 1989
  1286. X *
  1287. X *  Note on upping the handler process priority.  This is done to cause the
  1288. X *  handler task to get CPU before the current input event completes its
  1289. X *  processing so intuition calls made by the process are executed before
  1290. X *  the event is propogated.  If said intuition calls block, it's ok
  1291. X *  because they are not blocking the input handler process.
  1292. X */
  1293. X
  1294. X#include "dmouse.h"
  1295. X
  1296. X#ifdef LATTICE
  1297. X#include <stdio.h>
  1298. X#include <stdlib.h>
  1299. X#include <string.h>
  1300. X#endif
  1301. X
  1302. X/*typedef struct Layer          LAYER;*/
  1303. Xtypedef struct IE        *IEP;
  1304. Xtypedef struct IORequest    IORequest;
  1305. X
  1306. XDMS    *Dms               = NULL;
  1307. XIBASE    *IntuitionBase           = NULL;
  1308. XGFXBASE *GfxBase           = NULL;
  1309. Xstruct LayersBase  *LayersBase = NULL;
  1310. Xstruct ExecBase    *SysBase    = NULL;
  1311. X
  1312. Xstatic PORT    *IOPort = NULL;     /*    For IPC messages          */
  1313. Xstatic LIST    BlankList;        /*    list of external blanker programs */
  1314. X
  1315. Xstatic char    STimedout = 0;
  1316. Xstatic char    MTimedout = 0;
  1317. Xstatic long    STime = 0, MTime = 0;
  1318. X#ifdef DEBUG
  1319. Xstatic long    DBFh = NULL;
  1320. X#endif
  1321. X
  1322. X
  1323. X#define IBASE IntuitionBase
  1324. X
  1325. XNS    Ns = {    0, 0, 64, -1, 1, -1, -1, 0, CUSTOMSCREEN|SCREENQUIET };
  1326. XIE DummyIE = { 0 };
  1327. X
  1328. Xshort    NRMe;    /*  Don't Repeat Mouse Events   */
  1329. X
  1330. X#ifdef LATTICE
  1331. X__asm __saveds IEP handler(register __a0 IE *event);
  1332. X#else
  1333. XIE *handler();
  1334. X#endif
  1335. X
  1336. XLAYER *WhichMouseLayer ARGS((void));
  1337. Xvoid sendrequest ARGS((long, IE *));
  1338. XLAYER *WhichMouseLayer ARGS((void));
  1339. Xint doipcmsg ARGS((short));
  1340. Xvoid DeleteBlanker ARGS((IORequest *));
  1341. X__saveds void noname ARGS((void));
  1342. X
  1343. X#ifdef LATTICE
  1344. X__saveds void
  1345. Xnoname()
  1346. X#else
  1347. X_main()
  1348. X#endif
  1349. X{
  1350. X
  1351. X    reg DMS *dms;
  1352. X    IOR  *ior;
  1353. X    INT addhand;
  1354. X
  1355. X#ifndef LATTICE
  1356. X    geta4();
  1357. X#endif
  1358. X    SysBase = *(struct ExecBase **)4;
  1359. X#ifdef LATTICE
  1360. X    {
  1361. X    DOSBase = (struct DosLibrary *)OpenLibrary("dos.library", 0);
  1362. X    }
  1363. X#endif
  1364. X    {
  1365. X    reg PROC *proc = (PROC *)FindTask(NULL);
  1366. X    proc->pr_ConsoleTask = NULL;
  1367. X    }
  1368. X    NRMe = 0;
  1369. X    dms = Dms = (DMS *)FindPort(PORTNAME);
  1370. X    if (!dms)
  1371. X    return;
  1372. X    dms->Port.mp_Flags = PA_SIGNAL;
  1373. X    dms->Port.mp_SigBit = AllocSignal(-1);
  1374. X    dms->Port.mp_SigTask = FindTask(NULL);
  1375. X    dms->HandTask = dms->Port.mp_SigTask;
  1376. X    ior = CreateStdIO(&dms->Port);
  1377. X    IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0);
  1378. X    GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0);
  1379. X    LayersBase = (struct LayersBase *)OpenLibrary("layers.library", 0);
  1380. X    IOPort = CreatePort("DMouse.ipc", 0);
  1381. X    NewList(&BlankList);
  1382. X
  1383. X    if (!IntuitionBase || !GfxBase || !LayersBase)
  1384. X    goto startupfail;
  1385. X    addhand.is_Node.ln_Pri = dms->IPri;
  1386. X    addhand.is_Code = (FPTR)handler;
  1387. X    addhand.is_Data = NULL;
  1388. X
  1389. X    if (OpenDevice("input.device", 0, ior, 0)) {
  1390. X    goto startupfail;
  1391. X    } else {
  1392. X    SCR *scr = NULL;
  1393. X    uword *SprSavePtr = NULL;
  1394. X    long ipc_mask;
  1395. X
  1396. X    Signal(dms->ShakeTask, 1 << dms->ShakeSig);
  1397. X    ior->io_Command = IND_ADDHANDLER;
  1398. X    ior->io_Data = (APTR)&addhand;
  1399. X    ior->io_Message.mn_Node.ln_Type = NT_MESSAGE;
  1400. X    DoIO(ior);
  1401. X
  1402. X    ipc_mask = 1 << IOPort->mp_SigBit;
  1403. X
  1404. X    for (;;) {
  1405. X        reg long sigs = Wait(SBF_C|(1<<dms->Port.mp_SigBit)|ipc_mask);
  1406. X        if (sigs & (1 << dms->Port.mp_SigBit)) {
  1407. X        reg REQ *msg;
  1408. X        while (msg = (REQ *)GetMsg(&dms->Port)) {
  1409. X            switch((long)msg->Msg.mn_Node.ln_Name) {
  1410. X            case REQ_SCREENON:
  1411. X            if (scr)
  1412. X                CloseScreen(scr);
  1413. X            scr = NULL;
  1414. X            doipcmsg(0x82);
  1415. X            break;
  1416. X            case REQ_SCREENOFF:
  1417. X            if (scr)
  1418. X                ScreenToFront(scr);
  1419. X            if (doipcmsg(0x83) == 0 && scr == NULL) {
  1420. X                if (scr = OpenScreen(&Ns))
  1421. X                SetRGB4(&scr->ViewPort, 0, 0, 0, 0);
  1422. X            }
  1423. X            break;
  1424. X            case REQ_MOUSEON:
  1425. X            if (SprSavePtr) {
  1426. X                register COPINIT *ci = GfxBase->copinit;
  1427. X                ci->sprstrtup[1] = (ulong)SprSavePtr >> 16;
  1428. X                ci->sprstrtup[3] = (uword)(long)SprSavePtr;
  1429. X                SprSavePtr = NULL;
  1430. X            }
  1431. X            doipcmsg(0x80);
  1432. X            break;
  1433. X            case REQ_MOUSEOFF:
  1434. X            if (doipcmsg(0x81) == 0) {
  1435. X                reg COPINIT *ci = GfxBase->copinit;
  1436. X                if (ci->sprstrtup[0] != 0x120 || ci->sprstrtup[2] != 0x122)
  1437. X                break;
  1438. X
  1439. X                if (!SprSavePtr)
  1440. X                SprSavePtr = (uword *)((ci->sprstrtup[1] << 16) | ci->sprstrtup[3]);
  1441. X                ci->sprstrtup[1] = (ulong)dms->NoSprData >> 16;
  1442. X                ci->sprstrtup[3] = (uword)(long)dms->NoSprData;
  1443. X            }
  1444. X            break;
  1445. X            case REQ_DOCMD:
  1446. X            {
  1447. X                long fh = (long)Open("nil:", 1006);
  1448. X                Execute(dms->Cmd, NULL, fh);
  1449. X                if (fh)
  1450. X                Close(fh);
  1451. X            }
  1452. X            break;
  1453. X            case REQ_RAWMOUSE:
  1454. X            {
  1455. X                register LAYER *layer;
  1456. X
  1457. X                NRMe = 0;
  1458. X                Forbid();
  1459. X                layer = WhichMouseLayer();
  1460. X                if (msg->ie_Code == IECODE_RBUTTON && dms->LMBEnable && (msg->ie_Qualifier & dms->RQual)) {
  1461. X                register WIN *win;
  1462. X                if (layer && (win = (WIN *)layer->Window) && !(win->Flags & BACKDROP) && (win->NextWindow || win->WScreen->FirstWindow != win)) {
  1463. X                    if (dms->Workbench)
  1464. X                    WindowToBack(win);
  1465. X                    else
  1466. X                    BehindLayer(0, layer);
  1467. X                } else if (IBASE->FirstScreen)
  1468. X                    ScreenToBack(IBASE->FirstScreen);
  1469. X                }
  1470. X                if (layer && layer->Window) {
  1471. X                if (msg->ie_Code == IECODE_LBUTTON && !(((WIN *)layer->Window)->Flags & BACKDROP) && dms->LMBEnable && layer->ClipRect && layer->ClipRect->Next) {
  1472. X                    /*
  1473. X                     *    Note: Case where it is the 'first' click in a series, where dms->CTime is
  1474. X                     *          garbage, works properly no matter what DoubleClick returns.
  1475. X                     */
  1476. X                    if (dms->LQual == 0 || (msg->ie_Qualifier & dms->LQual)) {
  1477. X                    if ((APTR)dms->CWin == layer->Window && DoubleClick(dms->CTime.tv_secs, dms->CTime.tv_micro, msg->ie_TimeStamp.tv_secs, msg->ie_TimeStamp.tv_micro))
  1478. X                        --dms->CLeft;
  1479. X                    else
  1480. X                        dms->CLeft = dms->Clicks - 1;
  1481. X                    dms->CTime = msg->ie_TimeStamp;
  1482. X                    dms->CWin = (WIN *)layer->Window;
  1483. X                    if (dms->CLeft == 0) {
  1484. X                        dms->CLeft = dms->Clicks;
  1485. X                        if (dms->Workbench)
  1486. X                        WindowToFront((WIN *)layer->Window);
  1487. X                        else
  1488. X                        UpfrontLayer(0, layer);
  1489. X                    }
  1490. X                    }
  1491. X                }
  1492. X                if ((dms->AAEnable & 1) && (void *)layer->Window != (void *)IBASE->ActiveWindow && msg->ie_Code == IECODE_NOBUTTON && !(msg->ie_Qualifier & 0x7000)) {
  1493. X                    if (!IBASE->ActiveWindow || !IBASE->ActiveWindow->FirstRequest)
  1494. X                    ActivateWindow((WIN *)layer->Window);
  1495. X                }
  1496. X                }
  1497. X                Permit();
  1498. X            }
  1499. X            break;
  1500. X            case REQ_RAWKEY:
  1501. X            {
  1502. X                register LAYER *layer;
  1503. X
  1504. X                Forbid();
  1505. X                layer = WhichMouseLayer();
  1506. X                if (layer && layer->Window && (void *)layer->Window != (void *)IBASE->ActiveWindow) {
  1507. X                if (!IBASE->ActiveWindow || !IBASE->ActiveWindow->FirstRequest)
  1508. X                    ActivateWindow((WIN *)layer->Window);
  1509. X                }
  1510. X                Permit();
  1511. X            }
  1512. X            break;
  1513. X#ifdef DEBUG
  1514. X            case REQ_DEBUG:
  1515. X            {
  1516. X                char buf[128];
  1517. X                if (!DBFh) {
  1518. X                DBFh = Open("con:0/0/400/100/dmouse-debug", 1006);
  1519. X                if (!DBFh)
  1520. X                    break;
  1521. X                }
  1522. X                sprintf(buf, "%02lx %04lx %04lx\n",
  1523. X                msg->ie_Class,
  1524. X                msg->ie_Code,
  1525. X                msg->ie_Qualifier
  1526. X                );
  1527. X                Write(DBFh, buf, strlen(buf));
  1528. X            }
  1529. X            break;
  1530. X            case REQ_DEBUGOFF:
  1531. X            if (DBFh) {
  1532. X                Close(DBFh);
  1533. X                DBFh = NULL;
  1534. X            }
  1535. X            break;
  1536. X#endif
  1537. X            }
  1538. X            FreeMem(msg, msg->Msg.mn_Length);
  1539. X        }
  1540. X        }
  1541. X        if (sigs & SBF_C)
  1542. X        break;
  1543. X
  1544. X        /*
  1545. X         *    IPC request.
  1546. X         */
  1547. X
  1548. X        if (sigs & ipc_mask) {
  1549. X        reg IORequest *ior;
  1550. X        while (ior = (IORequest *)GetMsg(IOPort)) {
  1551. X            long req = 0;
  1552. X
  1553. X            if (ior->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {
  1554. X            FreeMem(ior, ior->io_Message.mn_Length);
  1555. X            continue;
  1556. X            }
  1557. X
  1558. X            ior->io_Error = 0;
  1559. X            switch(ior->io_Command) {
  1560. X            case 0x80:    /* mouse on  */
  1561. X            req = REQ_MOUSEON;
  1562. X            break;
  1563. X            case 0x81:    /* mouse off */
  1564. X            req = REQ_MOUSEOFF;
  1565. X            MTimedout = 1;
  1566. X            break;
  1567. X            case 0x82:    /* screen on */
  1568. X            req = REQ_SCREENON;
  1569. X            break;
  1570. X            case 0x83:    /* screen off*/
  1571. X            req = REQ_SCREENOFF;
  1572. X            STimedout = 1;
  1573. X            break;
  1574. X            case 0x84:    /* add hand  */
  1575. X            AddHead(&BlankList, ior);
  1576. X            ior = NULL;
  1577. X            break;
  1578. X            case 0x85:    /* rem hand  */
  1579. X            DeleteBlanker(ior);
  1580. X            ior = NULL;
  1581. X            break;
  1582. X            }
  1583. X            if (req)
  1584. X            sendrequest(req, NULL);
  1585. X            if (ior)
  1586. X            ReplyMsg(&ior->io_Message);
  1587. X        }
  1588. X        }
  1589. X    }
  1590. X#ifdef DEBUG
  1591. X    if (DBFh) {
  1592. X        Close(DBFh);
  1593. X        DBFh = NULL;
  1594. X    }
  1595. X#endif
  1596. X    ior->io_Command = IND_REMHANDLER;
  1597. X    ior->io_Data = (APTR)&addhand;
  1598. X    ior->io_Message.mn_Node.ln_Type = NT_MESSAGE;
  1599. X    DoIO(ior);
  1600. X    ior->io_Command = IND_WRITEEVENT;    /*  NULL EVENT    */
  1601. X    ior->io_Length = sizeof(IE);
  1602. X    ior->io_Data = (APTR)&DummyIE;
  1603. X    ior->io_Message.mn_Node.ln_Type = NT_MESSAGE;
  1604. X    DoIO(ior);
  1605. X    CloseDevice(ior);
  1606. X    {
  1607. X        reg MSG *msg;
  1608. X        while (msg = GetMsg(&dms->Port))
  1609. X        FreeMem(msg, msg->mn_Length);
  1610. X    }
  1611. X    if (scr)
  1612. X        CloseScreen(scr);
  1613. X    if (SprSavePtr) {
  1614. X        reg COPINIT *ci = GfxBase->copinit;
  1615. X        ci->sprstrtup[1] = (ulong)SprSavePtr >> 16;
  1616. X        ci->sprstrtup[3] = (uword)(long)SprSavePtr;
  1617. X        SprSavePtr = NULL;
  1618. X    }
  1619. X    }
  1620. X    goto closedown;
  1621. Xstartupfail:
  1622. X    dms->StartupError = 1;
  1623. X    Signal(dms->ShakeTask, 1 << dms->ShakeSig);
  1624. X    Wait(SBF_C);
  1625. Xclosedown:
  1626. X    DeleteStdIO(ior);
  1627. Xfail:
  1628. X    if (IOPort) {
  1629. X    IORequest *ior;     /*    wait for RemReq messages */
  1630. X
  1631. X    doipcmsg(0x86);     /*  send closedown requests  */
  1632. X    Forbid();
  1633. X    while (GetHead(&BlankList)) {
  1634. X        WaitPort(IOPort);
  1635. X        while (ior = (IORequest *)GetMsg(IOPort)) {
  1636. X        if (ior->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {
  1637. X            FreeMem(ior, ior->io_Message.mn_Length);
  1638. X            continue;
  1639. X        }
  1640. X        if (ior->io_Command == 0x85)    /*  receive remove req  */
  1641. X            DeleteBlanker(ior);
  1642. X        else
  1643. X            ReplyMsg(&ior->io_Message);              /*  ignore other reqs   */
  1644. X        }
  1645. X    }
  1646. X    DeletePort(IOPort);
  1647. X    Permit();
  1648. X    }
  1649. X    if (IntuitionBase)
  1650. X    CloseLibrary((LIB *)IntuitionBase);
  1651. X    if (GfxBase)
  1652. X    CloseLibrary((LIB *)GfxBase);
  1653. X    if (LayersBase)
  1654. X    CloseLibrary((LIB *)LayersBase);
  1655. X#ifdef LATTICE
  1656. X    {
  1657. X    CloseLibrary((LIB *)DOSBase);
  1658. X    }
  1659. X#endif
  1660. X    Forbid();
  1661. X    Signal(dms->ShakeTask, 1 << dms->ShakeSig);
  1662. X}
  1663. X
  1664. Xvoid
  1665. XDeleteBlanker(ior)
  1666. XIORequest *ior;
  1667. X{
  1668. X    IORequest *io2;
  1669. X
  1670. X    ior->io_Error = 0;
  1671. X    for (io2 = GetHead(&BlankList); io2; io2 = GetSucc(io2)) {
  1672. X    if (io2->io_Unit == ior->io_Unit) {
  1673. X        Remove(io2);
  1674. X        if (ior)
  1675. X        ReplyMsg(&ior->io_Message);
  1676. X        ReplyMsg(&io2->io_Message);
  1677. X        ior = NULL;
  1678. X    }
  1679. X    }
  1680. X    if (ior) {
  1681. X    ior->io_Error = -1;
  1682. X    ReplyMsg(&ior->io_Message);
  1683. X    }
  1684. X}
  1685. X
  1686. Xdoipcmsg(cmd)
  1687. Xshort cmd;
  1688. X{
  1689. X    short count = 0;
  1690. X    short flags = 1 << (cmd & 0x7F);    /*  enable flags */
  1691. X    IORequest *iob, *io;
  1692. X
  1693. X    for (iob = GetHead(&BlankList); iob; iob = GetSucc(iob)) {
  1694. X    if (cmd == 0x86 || (iob->io_Flags & flags)) {
  1695. X        io = AllocMem(sizeof(IORequest), MEMF_PUBLIC|MEMF_CLEAR);
  1696. X        if (io) {
  1697. X        io->io_Command = cmd;
  1698. X        io->io_Unit = iob->io_Unit;
  1699. X        io->io_Message.mn_ReplyPort = IOPort;
  1700. X        io->io_Message.mn_Length = sizeof(IORequest);
  1701. X        PutMsg(iob->io_Message.mn_ReplyPort, &io->io_Message);
  1702. X        ++count;
  1703. X        }
  1704. X    }
  1705. X    }
  1706. X    return((int)count);
  1707. X}
  1708. X
  1709. X/*
  1710. X *  The INPUT.DEVICE HANDLER
  1711. X *
  1712. X *  Note that for Lattice V5.02 and beyond we need no
  1713. X *  assembly tags because we can specify that the arguments
  1714. X *  are passed in registers.
  1715. X */
  1716. X
  1717. X#ifndef LATTICE
  1718. X
  1719. X#asm
  1720. X        ;    A0 = pointer to event linked list
  1721. X        ;    A1 = pointer to my data segment
  1722. X        ;    return new event linked list in D0
  1723. X
  1724. X        public  _CHandler
  1725. X
  1726. X_handler:
  1727. X        movem.l D2/D3/A0/A1/A4/A6,-(sp)
  1728. X        jsr     _CHandler
  1729. X        movem.l (sp)+,D2/D3/A0/A1/A4/A6
  1730. X        rts
  1731. X
  1732. X#endasm
  1733. X
  1734. X#endif
  1735. X
  1736. X/*
  1737. X *  (1) Accellerate mouse movements.
  1738. X *  (2) Auto-Select window
  1739. X */
  1740. X
  1741. X#ifdef LATTICE
  1742. X
  1743. X__asm __saveds IEP
  1744. Xhandler(register __a0 IE *Ev)
  1745. X{
  1746. X
  1747. X#else
  1748. X
  1749. XIE *
  1750. XCHandler(scr0, scr1, Ev)
  1751. Xlong scr0;
  1752. Xlong scr1;
  1753. XIE *Ev;
  1754. X{
  1755. X#endif
  1756. X    reg IE *ev;
  1757. X    reg DMS *dms;
  1758. X
  1759. X#ifndef LATTICE
  1760. X    geta4();
  1761. X#endif
  1762. X    dms = Dms;
  1763. X    for (ev = Ev; ev; ev = Ev->ie_NextEvent) {
  1764. X#ifdef DEBUG
  1765. X    if (dms->Debug) {
  1766. X        if (ev->ie_Class != IECLASS_TIMER)
  1767. X        sendrequest(REQ_DEBUG, ev);
  1768. X    } else if (DBFh) {
  1769. X        sendrequest(REQ_DEBUGOFF, ev);
  1770. X    }
  1771. X#endif
  1772. X    switch(ev->ie_Class) {
  1773. X    case IECLASS_RAWMOUSE:
  1774. X        /*
  1775. X         *    Mouse events restore both the screen and mouse pointer.
  1776. X         */
  1777. X
  1778. X        STime = ev->ie_TimeStamp.tv_secs + dms->STo;
  1779. X        MTime = ev->ie_TimeStamp.tv_secs + dms->MTo;
  1780. X        if (STimedout)
  1781. X        sendrequest(REQ_SCREENON, ev);
  1782. X        if (MTimedout)
  1783. X        sendrequest(REQ_MOUSEON, ev);
  1784. X        STimedout = MTimedout = 0;
  1785. X
  1786. X        /*
  1787. X         *    Mouse Acceleration
  1788. X         */
  1789. X        {
  1790. X        register short n;
  1791. X        register short s;
  1792. X
  1793. X        if (dms->Acc != 1) {
  1794. X            n = ev->ie_X;
  1795. X            s = 1;
  1796. X            if (n < 0) {
  1797. X            n = -n;
  1798. X            s = -1;
  1799. X            }
  1800. X            if (n > dms->AThresh)
  1801. X            ev->ie_X = s * (short)((n - dms->AThresh - 1) * dms->Acc + dms->AThresh + 1);
  1802. X            n = ev->ie_Y;
  1803. X            s = 1;
  1804. X            if (n < 0) {
  1805. X            n = -n;
  1806. X            s = -1;
  1807. X            }
  1808. X            if (n > dms->AThresh)
  1809. X            ev->ie_Y = s * (short)((n - dms->AThresh - 1) * dms->Acc + dms->AThresh + 1);
  1810. X        }
  1811. X        }
  1812. X
  1813. X        /*
  1814. X         *    Auto Activate and LMB (win/scrn front/bak)
  1815. X         */
  1816. X
  1817. X        if (dms->LMBEnable && ev->ie_Code == IECODE_RBUTTON && (ev->ie_Qualifier & dms->RQual))
  1818. X        ev->ie_Class = IECLASS_NULL;    /*  remove event    */
  1819. X        if (NRMe == 0 && ((dms->AAEnable & 1) || dms->LMBEnable)) {
  1820. X        register short old;
  1821. X        NRMe = 1;
  1822. X        if (ev->ie_Code != IECODE_NOBUTTON)
  1823. X            old = SetTaskPri(dms->Port.mp_SigTask, 21);
  1824. X        sendrequest(REQ_RAWMOUSE, ev);
  1825. X        if (ev->ie_Code != IECODE_NOBUTTON)
  1826. X            SetTaskPri(dms->Port.mp_SigTask, old);
  1827. X        }
  1828. X        break;
  1829. X    case IECLASS_RAWKEY:
  1830. X        /*
  1831. X         *    Keyboard events will kill the screen timeout but not
  1832. X         *    the mouse timeout.  Note that the priority of the
  1833. X         *    co-process must be upped to ensure it is able to make the
  1834. X         *    window active before the keystroke is passed further.
  1835. X         *
  1836. X         *    key releases are ignored
  1837. X         *
  1838. X         *    note: ie_Qualifier may or may not have bit 15 set
  1839. X         */
  1840. X        if (ev->ie_Code & 0x80)
  1841. X        break;
  1842. X        if (dms->AAEnable & 2) {
  1843. X        register short old = SetTaskPri(dms->Port.mp_SigTask, 21);
  1844. X        sendrequest(REQ_RAWKEY, ev);
  1845. X        SetTaskPri(dms->Port.mp_SigTask, old);
  1846. X        }
  1847. X        STime = ev->ie_TimeStamp.tv_secs + dms->STo;
  1848. X        if (STimedout) {
  1849. X        sendrequest(REQ_SCREENON, ev);
  1850. X        if (dms->MTo == 0)
  1851. X            sendrequest(REQ_MOUSEON, ev);
  1852. X        }
  1853. X        STimedout = 0;
  1854. X
  1855. X        if (ev->ie_Code == dms->Code && (ev->ie_Qualifier | 0x8000) == dms->Qual) {
  1856. X        sendrequest(REQ_DOCMD, ev);
  1857. X        ev->ie_Class = IECLASS_NULL;    /*  remove event    */
  1858. X        }
  1859. X        break;
  1860. X    case IECLASS_TIMER:
  1861. X        /*
  1862. X         *    On a timer event, if timeout has occured execute the operation
  1863. X         *    and reset the timeout.    Note that this will cause continuous
  1864. X         *    timeouts every STo and MTo seconds... required because at any
  1865. X         *    time Intuition might turn the mouse back on or open a screen or
  1866. X         *    something and I want the blanker's to work in the long run.
  1867. X         */
  1868. X        {
  1869. X        register long old;
  1870. X        if (dms->Reset) {
  1871. X            dms->Reset = 0;
  1872. X            STime = ev->ie_TimeStamp.tv_secs + dms->STo;
  1873. X            MTime = ev->ie_TimeStamp.tv_secs + dms->MTo;
  1874. X        }
  1875. X        if (dms->STo && (old = STime - ev->ie_TimeStamp.tv_secs) < 0) {
  1876. X            STime = ev->ie_TimeStamp.tv_secs + dms->STo + 10;
  1877. X            STimedout = 1;
  1878. X            MTimedout = 1;
  1879. X            if (old > -10) {
  1880. X            sendrequest(REQ_SCREENOFF, ev);
  1881. X            sendrequest(REQ_MOUSEOFF, ev);
  1882. X            }
  1883. X        }
  1884. X        if (dms->MTo && (old = MTime - ev->ie_TimeStamp.tv_secs) < 0) {
  1885. X            MTime = ev->ie_TimeStamp.tv_secs + dms->MTo + 1;
  1886. X            MTimedout = 1;
  1887. X            if (old > -10)
  1888. X            sendrequest(REQ_MOUSEOFF, ev);
  1889. X        }
  1890. X        }
  1891. X        break;
  1892. X    }
  1893. X    }
  1894. X    return(Ev);
  1895. X}
  1896. X
  1897. Xvoid
  1898. Xsendrequest(creq, ev)
  1899. Xlong creq;
  1900. Xreg IE *ev;
  1901. X{
  1902. X    reg REQ *req = AllocMem(sizeof(REQ), MEMF_PUBLIC);
  1903. X
  1904. X    if (req) {
  1905. X    req->Msg.mn_Node.ln_Name = (char *)creq;
  1906. X    req->Msg.mn_ReplyPort = NULL;
  1907. X    req->Msg.mn_Length = sizeof(REQ);
  1908. X    if (ev) {
  1909. X        req->ie_Class= ev->ie_Class;
  1910. X        req->ie_Code = ev->ie_Code;
  1911. X        req->ie_Qualifier = ev->ie_Qualifier;
  1912. X        req->ie_TimeStamp = ev->ie_TimeStamp;
  1913. X    }
  1914. X    PutMsg(&Dms->Port, (MSG *)req);
  1915. X    }
  1916. X}
  1917. X
  1918. XLAYER *
  1919. XWhichMouseLayer()
  1920. X{
  1921. X    register struct IntuitionBase *ib = IBASE;
  1922. X    register LAYER *layer = NULL;
  1923. X    register SCR *scr = ib->FirstScreen;
  1924. X
  1925. X    for (scr = ib->FirstScreen; scr; scr = scr->NextScreen) {
  1926. X    register short mousey = ib->MouseY;
  1927. X    register short mousex = ib->MouseX;
  1928. X    if (!(scr->ViewPort.Modes & LACE))
  1929. X        mousey >>= 1;
  1930. X    if (!(scr->ViewPort.Modes & HIRES))
  1931. X        mousex >>= 1;
  1932. X    if (layer = WhichLayer(&scr->LayerInfo, mousex, mousey - scr->ViewPort.DyOffset))
  1933. X        break;
  1934. X    if (mousey >= scr->ViewPort.DyOffset)
  1935. X        break;
  1936. X    }
  1937. X    return(layer);
  1938. X}
  1939. X
  1940. X
  1941. SHAR_EOF
  1942. echo "extracting dmouse-ipc.doc"
  1943. sed 's/^X//' << \SHAR_EOF > dmouse-ipc.doc
  1944. X
  1945. X    Talking to DMouse.
  1946. X
  1947. X    DMouse listens on the "DMouse.ipc" port.  To send a message, setup an
  1948. X    IORequest structure with the appropriate command and then
  1949. X    FindPort()/PutMsg() atomically, then wait for the request to be returned
  1950. X    to the reply port specified in the request.
  1951. X
  1952. X    *** REFER TO THE EXAMPLE BLANKER.C FOR USAGE
  1953. X
  1954. X    DMCMD_MOUSEON    turn on mouse        (io_Command 0x80)
  1955. X    DMCMD_MOUSEOFF    turn off mouse            0x81
  1956. X    DMCMD_SCREENON    turn on screen            0x82
  1957. X    DMCMD_SCREENOFF    turn off screen         0x83
  1958. X
  1959. X    DMCMD_ADDHANDLER    io_Message.mn_ReplyPort     0x84
  1960. X            contains port to send
  1961. X            msgs to.
  1962. X
  1963. X    DNCMD_REMHANDLER    io_Message.mn_ReplyPort     0x85
  1964. X            contains port to stop
  1965. X            sending msgs to.
  1966. X
  1967. X    DNCMD_PLEASEREMOVE    (DMouse->blanker)               0x86
  1968. X
  1969. X
  1970. X    DNCMD_ADDHANDLER:
  1971. X    io_Unit contains a magic cookie used to identify the handler and should
  1972. X    be set to some unique memory address (no accesses are actually made,
  1973. X    its just an identifier.
  1974. X
  1975. X    io_Flags contains a bitmap of things our blanker can handle:
  1976. X    0x03    we can handle mouse blanking
  1977. X    0x0C    we can handle screen blanking
  1978. X    0x0F    we can handle both
  1979. X
  1980. X    The request is NOT returned until you send a DNCMD_REMHANDLER request.
  1981. X    If DMouse is killed it will sent a DNCMD_PLEASEREMOVE (0x86) packet to
  1982. X    all active handlers and expect them to remove their handlers with a
  1983. X    DNCMD_REMHANDLER request.
  1984. X
  1985. X    NOTE:    You may run multiple blankers.    DMouse will send requests to
  1986. X    ALL active handlers.
  1987. X
  1988. X    DNCMD_REMHANDLER:
  1989. X    io_Unit contains a magic cookie that identifies which handler to remove.
  1990. X    The request is returned and then the original DNCMD_ADDHANDLER request
  1991. X    will be returned to you.  You can still receive DMouse commands up until
  1992. X    you finally get the original DNCMD_ADDHANDLER request back.
  1993. X
  1994. X    on return, io_Error is 0 on success, -1 on failure.
  1995. X
  1996. X    DNCMD_PLEASEREMOVE:
  1997. X    DMouse sends this to you asking you to remove your handler.  If you
  1998. X    receive this packet you must remove your handler with DNCMD_REMHANDLER.
  1999. X
  2000. X
  2001. X    DNCMD_MOUSEON,MOUSEOFF,SCREENON, SCREENOFF and PLEASEREMOVE commands
  2002. X    will be sent to the port specified in DNCMD_ADDHANDLER while it is
  2003. X    active and are expected to be returned to the DMouse handler.  You can
  2004. X    differentiate packets sourced by DMouse and packets sourced by you by
  2005. X    looking at the mn_Node.ln_Type field.  If it is NT_MESSAGE it was
  2006. X    sourced by DMouse, else it was sourced by you and replied by DMouse.
  2007. X
  2008. X
  2009. SHAR_EOF
  2010. echo "extracting dmouse.c"
  2011. sed 's/^X//' << \SHAR_EOF > dmouse.c
  2012. X
  2013. X/*
  2014. X *  DMOUSE.C    V1.20  3 August 1989
  2015. X *
  2016. X *  (c)Copyright 1989 by Matthew Dillon, All Rights Reserved
  2017. X *
  2018. X *  DMOUSE QUIT
  2019. X *  DMOUSE -a# -t# -s# -m# -c# -p# -w# -Ln -lqqqq -Rqqqq -An -Kcccc -Qqqqq -C cmd
  2020. X *       -d#
  2021. X *
  2022. X *  -a#     # = acceleration, default 3.    1 to disable
  2023. X *  -t#     # = mouse threshold before acceleration takes effect, def. 0
  2024. X *        (in pixels/event)
  2025. X *  -s#     # = screen timeout, default 5min,    0 to disable
  2026. X *  -m#     # = pointer timeout, default 5 secs,0 to disable
  2027. X *  -c#     # = # of clicks to bring window to front
  2028. X *  -p#     # = input device priority
  2029. X *  -w#     1 = Use WindowToFront()/WindowToBack()  else    (workbench users)
  2030. X *        0 = Use UpFrontLayer(), etc...                  (cli users)
  2031. X *  -L0     Disable LeftMouseButton->WindowToFront (LMB+RMB->ToBack)
  2032. X *  -L1     Enable it
  2033. X *  -lqqqq  Set qualifier + LMB for Window to front (default none)
  2034. X *  -Rqqqq  Set qualifier + RMB for Window/ScreenToBack (default LMB)
  2035. X *  -A0     Disable Auto-Activate window on mouse move
  2036. X *  -A1     Enable it, keyhit-auto-activate disabled    (bit 0 = mouse aa)
  2037. X *  -A3     Enable it, keyhit-auto-activate enabled    (bit 1 = key aa)
  2038. X *  -Kcccc  Set key code in hex that activates cmd, def is escape
  2039. X *  -Qqqqq  Set key qualifier in hex for keycode, def is left-amiga
  2040. X *  -C cmd  Set command (must be last option on command line), def NewCli
  2041. X *
  2042. X *  -d#     Debug mode    (if compiled in)
  2043. X */
  2044. X
  2045. X#include <stdio.h>
  2046. X#include "dmouse.h"
  2047. X
  2048. X#define VERSION 20
  2049. X
  2050. X#ifdef LATTICE
  2051. X#include <dos.h>
  2052. X#include <stdlib.h>
  2053. X#include <string.h>
  2054. X
  2055. Xint __stdargs CXBRK(void);
  2056. X
  2057. X__stdargs    /*  bug in lcr.lib  */
  2058. XCXBRK()
  2059. X{
  2060. X    return(0);
  2061. X}
  2062. X
  2063. X#else
  2064. Xextern int Enable_Abort;    /*    CLI break enable    */
  2065. X#endif
  2066. X
  2067. Xlong    ahtoi ARGS((char *));
  2068. Xvoid    main ARGS((int, char **));
  2069. X
  2070. Xvoid
  2071. Xmain(ac, av)
  2072. Xint ac;
  2073. Xchar *av[];
  2074. X{
  2075. X    reg short i, j, len;
  2076. X    reg long val;
  2077. X    reg char *ptr;
  2078. X    reg DMS  *dms = (DMS *)FindPort(PORTNAME);
  2079. X    short   exists = (dms != NULL);
  2080. X    short   create = (dms == NULL);
  2081. X    short   quit = 0;
  2082. X
  2083. X#ifndef LATTICE
  2084. X    Enable_Abort = 0;
  2085. X#endif
  2086. X    if (create) {
  2087. X    dms = AllocMem(sizeof(DMS), MEMF_PUBLIC|MEMF_CLEAR);
  2088. X    dms->IPri = 51;
  2089. X    dms->Version = VERSION;
  2090. X    dms->Acc = 3;
  2091. X    dms->STo = 5*60;
  2092. X    dms->MTo = 5;
  2093. X    dms->Code = 0x45;
  2094. X    dms->Qual = 0x8040;
  2095. X    dms->RQual= 0x4000;
  2096. X    dms->Clicks = 1;
  2097. X    dms->CLeft = dms->Clicks;
  2098. X    strcpy(dms->Cmd, "newcli");
  2099. X    dms->LMBEnable = 1;
  2100. X    dms->AAEnable = 3;
  2101. X    dms->NoSprData = AllocMem(12, MEMF_PUBLIC|MEMF_CHIP|MEMF_CLEAR);
  2102. X    dms->NoSprData[0] = 0xFE00;
  2103. X    dms->NoSprData[1] = 0xFF00;
  2104. X    }
  2105. X
  2106. X    for (i = 1; i < ac; ++i) {
  2107. X    ptr = av[i];
  2108. X    if (strcmp(ptr, "QUIT") == 0 || strcmp(ptr, "quit") == 0) {
  2109. X        quit = 1;
  2110. X        create = 0;
  2111. X        break;
  2112. X    }
  2113. X    val = atoi(ptr+2);
  2114. X    if (*ptr != '-')
  2115. X        goto def;
  2116. X
  2117. X    switch(ptr[1]) {
  2118. X    case 'd':
  2119. X        dms->Debug = val;
  2120. X        break;
  2121. X    case 'a':
  2122. X        dms->Acc = val;
  2123. X        break;
  2124. X    case 'c':
  2125. X        if (val < 1)
  2126. X        val = 1;
  2127. X        dms->Clicks = dms->CLeft = val;
  2128. X        break;
  2129. X    case 'w':
  2130. X        dms->Workbench = val;
  2131. X        break;
  2132. X    case 'p':
  2133. X        dms->IPri = val;
  2134. X        break;
  2135. X    case 't':
  2136. X        dms->AThresh = val;
  2137. X        break;
  2138. X    case 's':
  2139. X        dms->STo = val;
  2140. X        break;
  2141. X    case 'm':
  2142. X        dms->MTo = val;
  2143. X        break;
  2144. X    case 'L':
  2145. X        dms->LMBEnable = val;
  2146. X        break;
  2147. X    case 'l':
  2148. X        dms->LQual = ahtoi(ptr+2);
  2149. X        break;
  2150. X    case 'R':
  2151. X        dms->RQual = ahtoi(ptr+2);
  2152. X        break;
  2153. X    case 'A':
  2154. X        dms->AAEnable = val;
  2155. X        break;
  2156. X    case 'K':
  2157. X        dms->Code = ahtoi(ptr+2);
  2158. X        break;
  2159. X    case 'Q':
  2160. X        dms->Qual = ahtoi(ptr+2) | 0x8000;
  2161. X        break;
  2162. X    case 'S':
  2163. X    case 'M':
  2164. X        puts("-S and -M options obsolete");
  2165. X        break;
  2166. X    case 'C':
  2167. X        for (len = strlen(ptr+2) + 2, j = i + 1; j < ac; ++j)
  2168. X        len += strlen(av[j]) + 1;
  2169. X        strcpy(dms->Cmd, ptr + 2);
  2170. X        for (j = i + 1; j < ac; ++j) {
  2171. X        if (dms->Cmd[0])
  2172. X            strcat(dms->Cmd, " ");
  2173. X        strcat(dms->Cmd, av[j]);
  2174. X        }
  2175. X        i = ac;
  2176. X        break;
  2177. X    default:    def:
  2178. X        puts("DMOUSE QUIT  or");
  2179. X        puts("DMOUSE -a# -t# -s# -m# -Ln -Rqqqq -An -Kcccc -Qqqqq -C cmd");
  2180. X        printf("DMouse (c)Copyright 1989, Matthew Dillon, All Rights Reserved\nV1.%02d, 3 August 1989\n\n", VERSION);
  2181. X        puts("Freeware, redistributable for non-profit only");
  2182. X        puts("  -a#     Acceleration (default 3)");
  2183. X        puts("  -t#     Accel. threshold (default 0)");
  2184. X        puts("  -s#     Screen timeout (default 300)");
  2185. X        puts("  -m#     Mouse timeout (default 5)");
  2186. X        puts("  -c#     Set # of clicks for wintofront (default 1)");
  2187. X        puts("  -p#     # = input device priority");
  2188. X        puts("  -w#     0 = use UpFrontLayer().. 1 = use WindowToFront()");
  2189. X        puts("  -L0/1   LMB disable/enable (default 1=enabled)");
  2190. X        puts("  -lqqqq  LMB qualifier wintofront (default 0=none)");
  2191. X        puts("  -Rqqqq  RMB qualifier wintoback (default 4000=LMB)");
  2192. X        puts("  -A0-3   Auto-Activate Window disable/enable. B0=mouse B1=keyboard");
  2193. X        puts("  -Kcccc  Command Key Code, default 45 = esc");
  2194. X        puts("  -Qqqqq  Command Key Qualifier, default 40 = Left Amiga");
  2195. X        puts("  -C cmd  cmd to run, must be last option");
  2196. X        puts("Note: LMB(or -R qualifier)(hold)+RMB = WindowToBack");
  2197. X        puts("\n");
  2198. X        puts("Additionaly, Most options may be modified while DMOUSE is active");
  2199. X        create = 0;
  2200. X        i = ac;
  2201. X        break;
  2202. X    }
  2203. X    }
  2204. X    dms->Reset = 1;
  2205. X    if (!exists && create) {
  2206. X    PROC *proc;
  2207. X    printf("Installing DMouse, ");
  2208. X    fflush(stdout);
  2209. X    dms->Port.mp_Flags = PA_IGNORE;
  2210. X    dms->Port.mp_Node.ln_Pri = 0;
  2211. X    dms->Port.mp_Node.ln_Type= NT_MSGPORT;
  2212. X    dms->Port.mp_Node.ln_Name= AllocMem(sizeof(PORTNAME), MEMF_PUBLIC);
  2213. X    strcpy(dms->Port.mp_Node.ln_Name, PORTNAME);
  2214. X    NewList(&dms->Port.mp_MsgList);
  2215. X    dms->Segment = (long)LoadSeg("l:DMouse-Handler");
  2216. X    if (!dms->Segment)
  2217. X        dms->Segment = (long)LoadSeg("DMouse-Handler");
  2218. X    if (!dms->Segment) {
  2219. X        puts("Unable to find L:DMouse-Handler");
  2220. X        FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  2221. X        create = 0;
  2222. X    } else {
  2223. X        AddPort(&dms->Port);
  2224. X        dms->ShakeTask = FindTask(NULL);
  2225. X        dms->ShakeSig = AllocSignal(-1);
  2226. X        proc = (PROC *)CreateProc(dms->Port.mp_Node.ln_Name, 1, dms->Segment, 4096);
  2227. X        Wait(1 << dms->ShakeSig);
  2228. X        FreeSignal(dms->ShakeSig);
  2229. X        exists = 1;
  2230. X        quit = dms->StartupError;
  2231. X        if (quit)
  2232. X        puts("Handler error");
  2233. X        else
  2234. X        printf("ok.  DMouse V1.%02d, by Matthew Dillon.\n(c)Copyright 1989, Matthew Dillon, All Rights Reserved\n", VERSION);
  2235. X    }
  2236. X    }
  2237. X    if (quit) {
  2238. X    if (exists) {
  2239. X        printf("Removing, ");
  2240. X        fflush(stdout);
  2241. X        dms->ShakeTask = FindTask(NULL);
  2242. X        dms->ShakeSig = AllocSignal(-1);
  2243. X        Signal(dms->HandTask, SBF_C);
  2244. X        Wait(1 << dms->ShakeSig);
  2245. X        FreeSignal(dms->ShakeSig);
  2246. X        RemPort(&dms->Port);
  2247. X        FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  2248. X        UnLoadSeg(dms->Segment);
  2249. X        puts("ok");
  2250. X    }
  2251. X    exists = 0;
  2252. X    create = 0;
  2253. X    }
  2254. X    if (!exists) {
  2255. X    FreeMem(dms->NoSprData, 12);
  2256. X    FreeMem(dms, sizeof(DMS));
  2257. X    }
  2258. X}
  2259. X
  2260. Xlong
  2261. Xahtoi(str)
  2262. Xreg char *str;
  2263. X{
  2264. X    reg long val = 0;
  2265. X    reg char c;
  2266. X    while (c = *str) {
  2267. X    val <<= 4;
  2268. X    if (c >= '0' && c <= '9')
  2269. X        val |= (c & 15);
  2270. X    else
  2271. X        val |= (c & 15) + 9;
  2272. X    ++str;
  2273. X    }
  2274. X    return(val);
  2275. X}
  2276. X
  2277. X
  2278. SHAR_EOF
  2279. echo "extracting dmouse.doc"
  2280. sed 's/^X//' << \SHAR_EOF > dmouse.doc
  2281. X
  2282. XV1.20               DMOUSE.DOC           3 August 1989
  2283. X
  2284. X              Matthew Dillon
  2285. X              891 Regal Rd
  2286. X              Berkeley, California 94708
  2287. X              USA
  2288. X
  2289. X    DMouse (c)Copyright 1989 by Matthew Dillon, All Rights Reserved
  2290. X
  2291. X    Refer to BLANKER.DOC and DMOUSE-IPC.DOC for information on external
  2292. Xscreen blankers.
  2293. X
  2294. X    NOTES:    * dres.library no longer required.
  2295. X        * IPC mechanism changed
  2296. X
  2297. X    WORKBENCH USERS:    PLEASE READ THE REVISION HISTORY FOR V1.09 FOR
  2298. XPARTIAL SOLUTION TO INTUITION WINDOWTOFRONT() BUG.
  2299. X
  2300. X    YAIH (Yet Another Input Handler)... nahh, like DMouse better...
  2301. Xfor "Dillon's Mouse"???  V1.20 and beyond are no longer in public domain,
  2302. Xbut copyright to me.  They are still 'freeware'.
  2303. X
  2304. X    After looking at and rejecting several mouse-intuition input
  2305. Xhandler enhancers (you know, accelerate the mouse, click-to-front, etc...)
  2306. Xand finding them all useless, I have written my own.
  2307. X
  2308. X    - Any option can be turned on or off at any time.
  2309. X
  2310. X    - Screen blanks if keyboard or mouse is idle > N1 secs (default 300)
  2311. X        (mouse also blanks even if mouse blanking not turned on) One
  2312. X        can install a more sophisticated screen blanker (e.g. one that
  2313. X        brings up a pattern or something) if they wish.
  2314. X
  2315. X    - The Pesky Mouse blanks if mouse is idle > N2 secs (def 5)
  2316. X
  2317. X    - Auto Activate a window when the mouse is moved over it.  Window
  2318. X      also activated (if not already active) when you type.  These
  2319. X      two features may be turned on/off independantly
  2320. X
  2321. X    - Mouse Accelerator.  Back feeds power into the mouse unit;
  2322. X      give it a nudge and it is guarenteed to penetrate up to an
  2323. X      inch and a half of wall plaster (programmable depth).  Once
  2324. X      you start using it, you won't be able to switch back!
  2325. X
  2326. X    - Programmable command-key and command string ala PopCli, default
  2327. X      left-Amiga ESC.
  2328. X
  2329. X    - Left Mouse Button click in window brings it to the front
  2330. X        DOES NOT BRING THE WINDOW TO THE FRONT IF IT IS ALREADY
  2331. X        IN THE FRONT.  Other programs would call WindowToFront() on
  2332. X        every click, which is horrible if you have a simple-refresh
  2333. X        window.  WindowToFront() is NOT called for backdrop windows!
  2334. X
  2335. X        The qualifier along with the LMB is now settable with the -l option.
  2336. X
  2337. X      # clicks required is settable.
  2338. X
  2339. X    - Hold LMB, click Right Mouse Button .. Window to Back!  Great
  2340. X      for cycling windows.    See next feature for more info.
  2341. X
  2342. X      (the qualifier, normally the left mouse button, can be set with
  2343. X       the -R option).
  2344. X
  2345. X    - Same sequence as above, but if there is no window under the
  2346. X      current mouse position, there is only one window on the screen,
  2347. X      or the window under the mouse is a BACKDROP window, the
  2348. X      sequence cycles through Screens!
  2349. X
  2350. X    - NO DAMN CLOCK.  Use another utility to get a clock.  No other
  2351. X      glossy thrills.  DMouse is short, sweet, and functional.
  2352. X
  2353. X    - Does not use a CLI, should be placed in your startup-sequence.
  2354. X      DO NOT 'RUN' DMOUSE!
  2355. X
  2356. XINSTALLATION:
  2357. X
  2358. X    Place dmouse-handler in L: (or in the 'current' directory when DMOUSE
  2359. X    is run).
  2360. X
  2361. X    WORKBENCH USERS!!!!!!!!!!    There appears to be a bug in intuition's
  2362. X    WindowToFront() call, which can lock up intuition when workbench
  2363. X    icons are active.  Under the defaults, this will occur whenever you
  2364. X    depress the left mouse button over an icon.
  2365. X
  2366. X    A partial fix is in place V1.07 and beyond.  However, if you find
  2367. X    it still freezing up, the problem can be avoided as follows:  Either
  2368. X    turn off the left-mouse-button window- to-front feature (-L0) or leave
  2369. X    it on and set the number of clicks required to 2 (-c2) (and don't use
  2370. X    the feature while your mouse is over an icon).  V1.09 gives you yet
  2371. X    a THIRD option which is even more preferable ... change the qualifier
  2372. X    that goes along with the left mouse button to something other than 0,
  2373. X    like 3 (either shift). -l3
  2374. X
  2375. X    BLANKER:    To use a third party blanker (currently only the example at
  2376. X    this time) just run it in the background after you run dmouse.
  2377. X
  2378. X
  2379. XEXECUTE FROM A CLI (e.g. WORKBENCH STARTUP SCRIPT), example:
  2380. X
  2381. X    1> dmouse -c2 -l0 -C c:newshell "<nil: >nil: newcon:320/120/320/80/Shell"
  2382. X
  2383. X    There is no need to 'RUN' DMouse.  A double set of quotes may be
  2384. X    required for the program to work properly with ConMan.
  2385. X
  2386. X    NOTE:   The shell startup script should immediately CD somewhere.  DMouse
  2387. X        does not remember the cli's path.
  2388. X
  2389. XTO KILL:
  2390. X
  2391. X    1> dmouse QUIT
  2392. X
  2393. XIPC SUPPORT:
  2394. X
  2395. X    IPC support has changed radically due to removal of dres.library from
  2396. X    the required list.    The reason for the change is that I have been getting
  2397. X    my programs to compile under both Lattice and Aztec and did not want to
  2398. X    port dres.library to Lattice C.
  2399. X
  2400. X    Please refer to the example blanker programs and dmouse-ipc.doc for
  2401. X    more information.
  2402. X
  2403. X
  2404. XSOURCE:
  2405. X
  2406. X    Source is compileable under Aztec, +L (32 bit ints) and suitable
  2407. X    precompiled include file (remember the precompiled include file must
  2408. X    be precompiled with +L also).  Use the c32.lib library (Aztec C)
  2409. X
  2410. X    Source is also compileable under Lattice C V5.02 and beyond.
  2411. X
  2412. X    You need a working sup32.lib library to compile DMouse.  The library
  2413. X    source also includes the local/*.h includes and DMakefiles for making
  2414. X    precompiled include files.
  2415. X
  2416. XCOMMAND LINE ARGUMENTS:
  2417. X
  2418. X    If DMouse is already running, any specified options will be
  2419. X    incorporated.
  2420. X
  2421. X    quit    QUIT .. remove DMouse
  2422. X    -h        HELP
  2423. X    -a#     Set acceleration to #.    Default 3,         1 disables option
  2424. X    -t#     Set mouse acceleration threshhold, pixs/ev. default 0.
  2425. X    -s#     Set screen timeout to # (secs), Default 300, 0 disables option
  2426. X    -m#     Set mouse timeout to # (secs), Defalut 5,    0 disabled option
  2427. X    -c#     Set # of clicks required to bring window to front (def 1)
  2428. X    -p#     Set input handler priority (def 51) should always be > 50
  2429. X        (initial invocation only)
  2430. X
  2431. X    -w#     0 = use UpFrontLayer() etc... 1 = use WindowToFront() etc...
  2432. X        WindowToFront() properly refreshes SIMPLE_REFRESH windows
  2433. X        but a bug intuition can cause it to crash the machine if
  2434. X        a workbench icon is active at the time.
  2435. X
  2436. X    -L0/1    Disable/Enable left-button brings window to front
  2437. X    -A0-3    Disable/Enable AUTO-ACTIVATE. Bit #0 = mouse auto-activate
  2438. X                          #1 = keyboard auto-activate
  2439. X            (default 3, which enables both)
  2440. X
  2441. X    -lqqqq    Set Qualifier (HEX) with LMB for Window To Front (default is
  2442. X         0, meaning no qualifier).  Example:    -l0003 sets it to
  2443. X         either shift key.
  2444. X
  2445. X    -Rqqqq    Set Qualifier (HEX) with RMB for Window To Back (default is
  2446. X         the LMB qualifier).  Setting the qualifier to 0 disables
  2447. X         the feature.
  2448. X
  2449. X    -Kcccc    Set Keycode (HEX)   for command key (default 0045)
  2450. X
  2451. X    -Qqqqq    Set Qualifier (HEX) for command key (default 0040)
  2452. X
  2453. X    -C CMD    Set Command to run.  Default is NEWCLI.  Remaining arguments
  2454. X        on command line is the command.
  2455. X
  2456. X    -S/-M    REMOVED.  Obsoleted by new IPC mechanism.
  2457. X
  2458. X            QUALIFIERS (always entered in HEX)
  2459. X
  2460. X    0001    Left Shift
  2461. X    0002    Right Shift
  2462. X    0004    Caps Lock
  2463. X    0008    Control
  2464. X    0010    Left Alt
  2465. X    0020    Right Alt
  2466. X    0040    Left Amiga Key
  2467. X    0080    Right Amiga Key
  2468. X    0100    Numeric Key Pad Key (not useful for dmouse)
  2469. X    0200    Repeat        (not useful for dmouse)
  2470. X    0400    Interrupt        (not useful for dmouse)
  2471. X    0800    Multibroadcast    (not useful for dmouse)
  2472. X    1000    Middle Mouse Button (not normally implemented by intuition)
  2473. X    2000    Right Mouse Button
  2474. X    4000    Left Mouse Button
  2475. X
  2476. X    Note:    Combinations are allowed, in which case any one of the
  2477. X        selected qualifiers along with the left, right mouse button
  2478. X        or command key will cause the appropriate action to occur.
  2479. X
  2480. X
  2481. XRELEASE HISTORY:
  2482. X
  2483. XV1.20
  2484. X    -3rd party IPC mechanism fixed.  A new mechanism is now in place.
  2485. X
  2486. XV1.16
  2487. X    -Code fixed to compile under either Manx C 3.6 or Lattice C 5.02
  2488. X    -3rd party screen blanker supported removed due to removal of
  2489. X     dnet.library (which is too difficult to port at this time).
  2490. X
  2491. XV1.14
  2492. X    -minor bug fixes.  DLineArt added to distribution (removed again in
  2493. X     1.16 temporarily)
  2494. X
  2495. XV1.13
  2496. X    -d option (debug mode if compiled in) not compiled in on release
  2497. X       binaries
  2498. X    -You can now bring up a new cli without having to move the mouse from
  2499. X     its initial (power up) position.
  2500. X    -Checks if the copper list stuff it modifies is valid.  If not, does
  2501. X     not modify the copper list stuff (you loose mouse blanking instead of
  2502. X     crashing the machine for those using the hires board)
  2503. X
  2504. X
  2505. XV1.12
  2506. X    -S option added, external screen blanker supported.
  2507. X    -M option added, external mouse blanker supported.
  2508. X    -IPC commands changed to 'mouse on/off' 'screen on/off', they used
  2509. X     to be 'mouse / nomouse' and 'blank / noblank'.
  2510. X
  2511. XV1.11
  2512. X    -Intelligent requester handling: auto-activate is disabled while the
  2513. X     active window has a requester in it.  Slight modification of key
  2514. X     handling (key-up events are ignored by DMouse).  Addition of
  2515. X     text-based IPC to blank/unblank the mouse/screen.
  2516. X
  2517. XV1.10
  2518. X    -Fixed -A bug ... -A2 now enables auto-activate-on-key and disables
  2519. X     auto-activate-on-mouse
  2520. X
  2521. XV1.09
  2522. X
  2523. X    Workbench users probably want to use the following options: -w1 -l0003
  2524. X    These use WindowToFront() (your windows get refreshed properly), but
  2525. X    also requires you to depress a shift key + LMB to get the window-to-front
  2526. X    feature.
  2527. X
  2528. X    dmouse -w1 -l0003
  2529. X
  2530. X    -SELECTABLE USE OF UpFrontLayer() etc..  OR  WindowToFront() etc...
  2531. X     Workbench users should use WindowToFront() (-w1), while CLI users
  2532. X     probably want to use UpFrontLayer() (default).
  2533. X
  2534. X     Reason:    WindowToFront()/Back can crash the Amiga if called while
  2535. X     a workbench ICON is highlighted.  Unfortunetly, UpFrontLayer(), which
  2536. X     does not have the bug, also does not automatically refresh
  2537. X     simple-refresh windows!
  2538. X
  2539. X    -New option -lqqqq (SET QUALIFIER WITH LEFT MOUSE BUTTON TO GET
  2540. X     WINDOW-TO-FRONT FEATURE).    WORKBENCH USERS NOTE:  By setting this
  2541. X     qualifier to a shift key, for instance, you can safely move icons
  2542. X     around without crashing the machine because DMouse will not issue
  2543. X     the WindowToFront() call unless you are holding the qualifier key
  2544. X     down while pressing the left mouse button.
  2545. X
  2546. X    -Bug fixed thanks to user persistance!  If you disable mouse blanking,
  2547. X     and enable screen blanking (which blanks the mouse too when it
  2548. X     happens), hitting a key would bring back the screen but not the mouse.
  2549. X
  2550. XV1.08
  2551. X     Botched.
  2552. X
  2553. XV1.07
  2554. X    -All intuition calls are made from an independant process rather than
  2555. X     the input handler routine.  This also fixes a couple of deadlock bugs,
  2556. X     but not the workbench-icon deadlock bug.
  2557. X    -Mouse response is no longer jerky when the system is loaded down.
  2558. X    -Keyboard-Auto-Activate-Window independant of Mouse-Auto-Activate-Window
  2559. X     (enhanced -A option)
  2560. X    -No need to OR the -Q qualifier with 8000 anymore
  2561. X    -WindowToFront() never called for backdrop windows, which ought to fix
  2562. X     the workbench freeze bug and other problems.
  2563. X    -Mouse automatically blanked when screen blanks, whether mouse blanking
  2564. X     is enabled or not.
  2565. X    -Can set input handler priority (initial invocation only).
  2566. X    -New Timeouts go into effect immediately rather than after the
  2567. X     next mouse/keyboard event.
  2568. X
  2569. XV1.00-V1.06
  2570. X    Before Written history
  2571. X
  2572. X
  2573. SHAR_EOF
  2574. echo "extracting dmouse.h"
  2575. sed 's/^X//' << \SHAR_EOF > dmouse.h
  2576. X
  2577. X/*
  2578. X *  DMOUSE.H
  2579. X */
  2580. X
  2581. X#include <local/typedefs.h>
  2582. X
  2583. X#define DMS struct _DMS
  2584. X#define REQ struct _REQ
  2585. X
  2586. X#define PORTNAME    "DMouse"
  2587. X
  2588. X#define REQ_SCREENON    -1
  2589. X#define REQ_SCREENOFF    -2
  2590. X#define REQ_MOUSEON    -3
  2591. X#define REQ_MOUSEOFF    -4
  2592. X#define REQ_DOCMD    -5
  2593. X#define REQ_RAWMOUSE    -6
  2594. X#define REQ_RAWKEY    -7
  2595. X#define REQ_DEBUG    -8
  2596. X#define REQ_DEBUGOFF    -9
  2597. X
  2598. X#define SBF_C    SIGBREAKF_CTRL_C
  2599. X#define SBF_D    SIGBREAKF_CTRL_D
  2600. X#define SBF_E    SIGBREAKF_CTRL_E
  2601. X#define SBF_F    SIGBREAKF_CTRL_F
  2602. X
  2603. Xtypedef struct IOStdReq     IOR;
  2604. Xtypedef struct Interrupt    INT;
  2605. Xtypedef struct timeval        TS;
  2606. Xtypedef void            (*FPTR)();
  2607. X
  2608. X
  2609. XDMS {
  2610. X    PORT    Port;
  2611. X    short   Version;
  2612. X    short   Acc;
  2613. X    short   AThresh;
  2614. X    long    STo;
  2615. X    long    MTo;
  2616. X    uword   Code;
  2617. X    uword   Qual;
  2618. X    uword   RQual;        /*    Right button qualifier    */
  2619. X    uword   LQual;        /*    Left button qualifier    */
  2620. X    char    Cmd[256];
  2621. X    char    LMBEnable;
  2622. X    char    AAEnable;
  2623. X    char    IPri;
  2624. X    char    FSEnable;        /*    Foreign Screen Enable    */
  2625. X    char    Workbench;        /*    Use WindowToFront/Back    */
  2626. X    char    Debug;        /*    Debug Mode        */
  2627. X    char    Reserved3;
  2628. X    TASK    *HandTask;
  2629. X    TASK    *ShakeTask;
  2630. X    short   ShakeSig;
  2631. X    short   StartupError;
  2632. X    uword   *NoSprData;
  2633. X    long    Segment;
  2634. X
  2635. X    uword   Clicks;    /*  # clicks required        */
  2636. X    uword   CLeft;    /*  # clicks left to do     */
  2637. X    TS        CTime;    /*  time of last click        */
  2638. X    WIN     *CWin;    /*  All clicks in same window    */
  2639. X    char    Reset;    /*  Option modified, reset tos    */
  2640. X
  2641. X    char    *MRemote;    /*  Remote mouse blanker (obsolete) */
  2642. X    char    *SRemote;    /*  Remote screen blanker(obsolete) */
  2643. X    long    DLock[2];    /*  synchronizing lock     (obsolete) */
  2644. X};
  2645. X
  2646. XREQ {
  2647. X    MSG     Msg;
  2648. X    TS        ie_TimeStamp;
  2649. X    ubyte   ie_Class;
  2650. X    uword   ie_Code;
  2651. X    uword   ie_Qualifier;
  2652. X};
  2653. X
  2654. X
  2655. SHAR_EOF
  2656. echo "End of archive 1 (of 1)"
  2657. # if you want to concatenate archives, remove anything after this line
  2658. exit
  2659.